Я изменил что-то новое в базе данных. Так как у меня есть 5 элементов mongodb.. вот код
Это для моего main-model.js
const mongoose = require('mongoose')
const Schema = mongoose.Schema
const mainSchema = new Schema({
likes:{
type:Number,
max:100000
},
people:[{
key:{type:String},
name:{type:String}
}]
},{
timestamps:true
})
const MAIN = mongoose.model('liker-model',mainSchema)
MAIN.insertMany([
{"_id":mongoose.Types.ObjectId(1),likes:0,people:[]},
{"_id":mongoose.Types.ObjectId(2),likes:0,people:[]},
{"_id":mongoose.Types.ObjectId(3),likes:0,people:[]},
{"_id":mongoose.Types.ObjectId(4),likes:0,people:[]},
{"_id":mongoose.Types.ObjectId(5),likes:0,people:[]},
])
module.exports = MAIN
Сейчас я передам liker.js
который будет кодом
const router = require('express').Router()
let Main = require('../models/main-model')
router.route('/').get((req,res) => {
Main.find()
.then(likes => res.json(likes))
.catch(err => console.info(err))
})
router.route('/item/:id').post((req,res) => {
const id = req.params.id
console.info(id)
if (!id) return res.status(400).json({ message: "missing id" });
const { likes, people } = req.body;
Main
.updateOne(
{ _id: id },
{
$addToSet: { people: { $each: people } },
$set: {
likes,
},
},
)
.then((likes) => res.json({ message: "New User Added" }))
.catch((err) => res.status(400).json("Error :" + err));
})
module.exports = router
На основании того, что вы обсуждаете, это СВЯЗЬ
но я сделал что-то новое.. В первой части Main.insertMany()
в main-model.js
я создаю 5 элементов, но здесь что-то идет не так.. Если я попытаюсь перезапустить свой server.js, он создаст еще 5 элементов, поэтому он покажет что-то вроде этого в моя база данных.
Я хочу сказать, что, поскольку у меня есть 5 фотоэлементов в моем интерфейсе, это означает, что мне нужно 5 элементов в моей базе данных, которые вы увидите в моем
main-model.js
. Теперь, когда у меня есть представление о том, как я буду помещать свои элементы в свой массив для каждого элемента, который я хочу нажать. В коде, который вы упомянули в моем посте
router.route('/item/1').post((req,res) => {
const { likes, people } = req.body
Main.updateOne({likes}, {$addToSet: { people: {$each: people} } } )
.then(likes => res.json('New User Added'))
.catch(err => res.status(400).json('Error :' + err))
})
но так как мне нужен идентификатор, как вы упоминали ранее...
router.route("/item/:id").post((req, res) => {
const id = req.params.id;
if (!id) return res.status(400).json({ message: "missing id" });
const { likes, people } = req.body;
const model = mongoose.model("collection_name", mainSchema);
model
.updateOne(
{ _id: id },
{
$addToSet: { people: { $each: people } },
$set: {
likes,
},
},
)
.then((likes) => res.json({ message: "New User Added" }))
.catch((err) => res.status(400).json("Error :" + err));
});
но в моем insertMany() он создает свой собственный идентификатор, поэтому я должен передать его в своем интерфейсе
axios.get('http://localhost:7171/likes')
.then(listid => setlistid(list.data))
.catch(err => console.info(err))
что-то вроде этого и передать его обратно в мой бэкэнд/базу данных
axios.post('http://localhost:7171/likes/item/listid[0]._id',{ people:{name:name,key:key }})
axios.post('http://localhost:7171/likes/item/listid[1]._id',{ people:{name:name,key:key } })
axios.post('http://localhost:7171/likes/item/listid[2]._id',{ people:{name:name,key:key } })
axios.post('http://localhost:7171/likes/item/listid[3]._id',{ people:{name:name,key:key } })
axios.post('http://localhost:7171/likes/item/listid[4]._id',{ people:{name:name,key:key } })
Я уже понял.. но вы не представляете, как мне не воссоздать еще 5 элементов в моем main-model.js
всякий раз, когда я пытался перезапустить свой server.js???
ох, это моя самая длинная дискуссия, лол..
Во-первых, mongodb хранит идентификатор не как целое число (например, 1
,2
,3
,4
,5
), а сохраняет как ObjectId.
ссылка: https://mongoosejs.com/docs/guide.html#_id
Во-вторых, если вы хотите вставить несколько значений по умолчанию для коллекции liker-model
. То, как вы используете, неверно, потому что код id
с mongoose.Types.ObjectId(1)
будет генерировать новый один раз каждый раз, когда вы запускаете внутренний сервер nodejs. Вы должны сделать что-то вроде
const defaultIdLikerModel = [
"00000001a24dfc9b806e607f",
"00000001a24dfc9b806e607d",
"6235f2fea24dfc9b806e6080",
"6235f306a24dfc9b806e6081",
"6235f30aa24dfc9b806e6082",
]; // generate default id to query insert only not exist
const queries = []; // push multiple query insert if not exist
defaultIdLikerModel.forEach((likerId) => {
queries.push(
MAIN.findOneAndUpdate(
{ _id: likerId },
{
$setOnInsert: {
likes: 0,
people: [],
},
},
{
upsert: true,
},
),
);
});
await Promise.all(queries); // execute all queries
В-третьих, в вашем маршруте /item/:id
. Если вам требуется main-model.js, так как вы были объявлены моделью с помощью const MAIN = mongoose.model('liker-model',mainSchema)
, вам не нужно повторно объявлять с помощью const model = mongoose.model("collection_name", mainSchema);
. Просто используйте что-то вроде этого
const model = require('./main-model')
model.updateOne(
{ _id: id },
{
$addToSet: { people: { $each: people } },
$set: {
likes,
},
},
)
.then((likes) => res.json({ message: "New User Added" }))
.catch((err) => res.status(400).json("Error :" + err));
На самом деле, неважно, сэр.. давайте прекратим это, хахаха... Я исследую это для себя. Кажется, я просто пропустил часть урока, хахах..
ах :D Ваш main-model.js
не асинхронный. Итак, вы меняете await Promise.all(queries)
=> Promise.all(queries).then().catch(error => console.info(error)
Ключ для этого developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Сэр, я думаю, у вас есть ошибка в части запросов? Это дает мне ошибку, как это.
await Promise.all(queries);
^^^^^
SyntaxError: await is only valid in async functions and the top level bodies of modules