在 mongodb 中创建 5 个项目并更新数组(继续我上一个问题的讨论)

Creating 5 items and updating the array in mongodb (Continue Discussion from my previous question)

我确实更改了数据库的一些新内容..因为我有 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.log(err))
})

router.route('/item/:id').post((req,res) => {

    const id = req.params.id
    
    console.log(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-model.jsMain.insertMany() 的第一部分我创建了 5 个项目但是这里出了问题..如果我试图重新运行我的 server.js 它将创建另外 5 个项目,因此它将在我的数据库中显示类似的内容。 我的意思是,由于我的前端有 5 个照片项目,这意味着我的数据库中需要 5 个项目,您将在我的 main-model.js 中看到这些项目。现在,因为我知道如何为我想要推送的每个项目推送我的项目到我的数组中。在你在我的 post

中提到的代码中
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))

})  

但是因为我需要你之前提到的 id...

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() 中它创建了自己的 ID,因此我必须将它传递到我的前端

      axios.get('http://localhost:7171/likes')
        .then(listid => setlistid(list.data))
        .catch(err => console.log(err))

类似这样的东西并传回我的 backend/database

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 } })

我已经明白了..但是你知道吗,每当我尝试重新运行我的 server.js 时,我怎样才能不在我的 main-model.js 中重新创建另外 5 个项目???

呃这是我最长的讨论哈哈..

首先,mongodb 不会将 id 存储为整数(如 12345 ) 但存储为 ObjectId

参考:https://mongoosejs.com/docs/guide.html#_id


其次,如果您想为集合插入多个默认值liker-model。您使用的方式是错误的,因为每次启动 nodejs 后端服务器时,代码 idmongoose.Types.ObjectId(1) 都会生成一个新的一次。你应该做类似

的事情

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) 的模型,则不需要 re-declare 和 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));