【问题标题】:Push array of an objects to array of documents in MongoDB without duplicating the property value将对象数组推送到 MongoDB 中的文档数组而不复制属性值
【发布时间】:2019-09-18 17:56:33
【问题描述】:

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"
        }
    ]
}

我尝试了以下moongoose代码:

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 数组中

【问题讨论】:

  • 这是因为您没有将“_id”(应与现有文档中的相同)字段与您的玩家 ID 一起添加
  • 是的,它是自动生成的,因此无法识别为我们正在推送的同一元素。但是我希望如何处理它@AnirudhSimha

标签: node.js mongodb mongoose nosql


【解决方案1】:

我不知道确切的查询,但如果您一次检查一个成员,下面的查询将起作用。您必须修改它以检查请求中的数组输入。

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'。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-24
    • 1970-01-01
    • 2016-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多