MongoDB文档的当前状态:
// Team document
{
"_id" : ObjectId("5cc6d4c8c3faa84f28e5fe1d"),
"teamMembers" : [
{
"player" : ObjectId("5ba24b8594a05f3788980a11"),
"_id" : ObjectId("5cc6d4c8c3faa84f28e5fe1e")
}
],
"createdDateTime" : ISODate("2019-04-29T10:41:12.836Z"),
"__v" : 0
}
我需要在上述文档的teamMembers属性中添加以下请求数据:
{
"teamId": "5cc6d4c8c3faa84f28e5fe1d",
"playerList": [
{
"player": "5ba24b8594a05f3788980a11"
},
{
"player": "5ba38151e1baf00264786891"
},
{
"player": "5ba38151e1baf0026478688c"
}
]
}
我尝试过以下月光代码:
Team.update({ '_id': req.body.teamId }, {
$addToSet: {
'teamMembers': { $each: req.body.playerList }
}
}, function (err) {
if (err) {
/* error response */
}
else {
/* success response */
}
});
问题::如果播放器已存在于数组中,则不应将其添加到teamMembers数组中,但在我的情况下,它会添加播放器的重复记录。因此,在上述情况下,player:5ba24b8594a05f3788980a11
已存在于MongoDB文档中,因此不应添加它,而应在teamMembers
数组中添加剩余的两个播放器
答案 0 :(得分:0)
我不知道确切的查询,但是如果您一次检查一个成员,则下面的查询将起作用。您将必须对此进行修改以检查请求中的数组输入。
Team.findOneAndUpdate({
'_id': req.body.teamId,
teamMembers: { $not: { $elemMatch: { player: player1 } } },
$addToSet: { 'teamMembers': player1 }
});
可能的解决方案
Team.findOneAndUpdate({
'_id': req.body.teamId,
teamMembers: { $not: { $elemMatch: { player: { $in : req.body. playerList } } } },
$addToSet: { teamMembers': { $each: req.body.playerList }
});
此查询的作用是什么?在检查teamMembers数组是否已将播放器传入请求后,它将在文档中以“ _id”查找并添加新的播放器。