Ста*_*цев 1 mongoose mongodb node.js mongodb-query
我在数据库中有对象,它们有一个评级对象数组,我需要如果 user\xe2\x80\x99s ID 已在这些对象中,则更新 Rate ,如果没有,则使用以下命令将新对象添加到数组中费率和用户ID
\n\n文件图片:
\n\n\n\n代码 :
\n\nrouter.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});\nRun Code Online (Sandbox Code Playgroud)\n\nJSON 文档:
\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}\nRun Code Online (Sandbox Code Playgroud)\n
您可以尝试.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。