MongoDB 更新数组中的对象(如果存在)或推送

Ста*_*цев 1 mongoose mongodb node.js mongodb-query

我在数据库中有对象,它们有一个评级对象数组,我需要如果 user\xe2\x80\x99s ID 已在这些对象中,则更新 Rate 如果没有,则使用以下命令将新对象添加到数组中费率用户ID

\n\n

文件图片:

\n\n

在此输入图像描述

\n\n

代码 :

\n\n
router.post(\'/rating\', (req, res) => {\n // console.log(req.body)\n  let ID = \'f58482b1-ae3a-4d8a-b53b-ede80fe1e225\';\n  // let user = \'5e094d988ddbe02020e13879\';\n  let user = \'asdadasdasd\';\n  Habalka.find({\n      _id: ID\n    },\n    {rating: {$elemMatch: {user}}})\n    .then(res => {\n      if (res[0].rating.length) {\n        // Habalka.updateOne(\n        //   {\n        //     _id: ID,\n        //     \'rating.user\': user\n        //   },\n        //   {$inc:{"rating.$.rate.1":10}}\n        // )\n        //   .then(resUpdate => {\n        //     console.log(resUpdate)\n        //   })\n        // **HERE I need to update rate if the user is already there**\n      } else {\n        // **HERE if there is no user, I need to insert an object with it and rate**\n      }\n    });\n  // console.log(req)\n});\n
Run Code Online (Sandbox Code Playgroud)\n\n

JSON 文档:

\n\n
{ \n  "_id":"f58482b1-ae3a-4d8a-b53b-ede80fe1e225",\n   "bio":{ \n      "firstname":"\xd0\x9b\xd0\xb5\xd0\xbd\xd0\xb0",\n      "lastname":"\xd1\x84\xd1\x8b\xd0\xb2",\n      "middlename":"",\n      "company":"\xd0\xb2\xd0\xb2"\n   },\n   "files":[ \n      { \n         "_id":"2e4e40c7-4df6-4974-8d16-bb24cd8134d6",\n         "destination":"./uploads/f58482b1-ae3a-4d8a-b53b-ede80fe1e225",\n         "filename":"2e4e40c7-4df6-4974-8d16-bb24cd8134d6.mp3",\n         "path":"uploads\\\\f58482b1-ae3a-4d8a-b53b-ede80fe1e225\\\\2e4e40c7-4df6-4974-8d16-bb24cd8134d6.mp3",\n         "folder":"f58482b1-ae3a-4d8a-b53b-ede80fe1e225",\n         "info":{ \n            "size":20805727,\n            "mimetype":"audio/mp3",\n            "encoding":"7bit",\n            "originalname":"\xd0\x90\xd1\x85\xd1\x83\xd0\xb5\xd0\xb2\xd1\x88\xd0\xb8\xd0\xb9 \xd0\x9b\xd0\xb5\xd0\xbd\xd1\x83\xd1\x81\xd0\xb8\xd0\xba (\xd0\x91\xd0\xb0\xd0\xbd\xd0\xba \xd1\x80\xd1\x83\xd1\x81\xd1\x81\xd0\xba\xd0\xb8\xd0\xb9 \xd1\x81\xd1\x82\xd0\xb0\xd0\xbd\xd0\xb4\xd0\xb0\xd1\x80\xd1\x82). \xd0\x92\xd1\x8b\xd0\xbf\xd1\x83\xd1\x81\xd0\xba #5..mp3",\n            "fieldname":"selectedFile"\n         },\n         "userId":"5e05da745b21e61ccc84a892",\n         "date":"2019-12-27T10:19:12.213Z",\n         "guessId":{ \n            "f58482b1-ae3a-4d8a-b53b-ede80fe1e225":[ \n               "5e05da745b21e61ccc84a892",\n               "5e094d988ddbe02020e13879"\n            ],\n            "b7d00dea-c872-43f4-b193-8454bef5cf85":[ \n\n            ]\n         }\n      },\n      { \n         "_id":"81b94dea-ece6-421c-b68a-0aa59332cd0d",\n         "destination":"./uploads/f58482b1-ae3a-4d8a-b53b-ede80fe1e225",\n         "filename":"81b94dea-ece6-421c-b68a-0aa59332cd0d.mp3",\n         "path":"uploads\\\\f58482b1-ae3a-4d8a-b53b-ede80fe1e225\\\\81b94dea-ece6-421c-b68a-0aa59332cd0d.mp3",\n         "folder":"f58482b1-ae3a-4d8a-b53b-ede80fe1e225",\n         "info":{ \n            "size":13515683,\n            "mimetype":"audio/mp3",\n            "encoding":"7bit",\n            "originalname":"\xd0\x92\xd1\x8b\xd0\xbf\xd1\x83\xd1\x81\xd0\xba #75 \xd0\x9f\xd0\xbe\xd0\xbf\xd1\x80\xd0\xbe\xd1\x88\xd0\xb0\xd0\xb9\xd0\xba\xd0\xb0 \xd0\x9d\xd0\xa1\xd0\x92..mp3",\n            "fieldname":"selectedFile"\n         },\n         "userId":"5e05da745b21e61ccc84a892",\n         "date":"2019-12-27T10:25:37.710Z",\n         "guessId":{ \n            "b7d00dea-c872-43f4-b193-8454bef5cf85":[ \n               "5e05da745b21e61ccc84a892",\n               "5e094d988ddbe02020e13879"\n            ],\n            "f58482b1-ae3a-4d8a-b53b-ede80fe1e225":[ \n\n            ]\n         }\n      }\n   ],\n   "date":"2019-12-27T10:19:12.213Z",\n   "__v":1,\n   "rating":[ \n      { \n         "rate":4,\n         "user":"5e094d988ddbe02020e13879"\n      },\n      { \n         "rate":3,\n         "user":"asdadasdasd"\n      }\n   ]\n}\n
Run Code Online (Sandbox Code Playgroud)\n

sri*_*asy 6

您可以尝试.bulkWrite()

Habalka.bulkWrite([{
    updateOne: {
        "filter": { "rating.user": "asdadasdasd" },
        "update": { $set: { "rating.$.rate": 13 } } // Will update rate
    }
},
{
    updateOne: {
        "filter": { "rating.user": { $ne: "asdadasdasd" } },
        "update": { $push: { "rating": { "user": "asdadasdasd", "rate": 13 } } } // will push new object to rating
    }
}])
Run Code Online (Sandbox Code Playgroud)

在以上两个中,updateOne只有一个会在任何给定情况下写入数组rating