将对象数组推送到MongoDB中的文档数组,而无需复制属性值

时间:2019-04-30 05:54:19

标签: node.js mongodb mongoose nosql

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数组中添加剩余的两个播放器

1 个答案:

答案 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”查找并添加新的播放器。

相关问题