如何更新 mongodb 对象中另一个嵌套数组的嵌套数组

How to update my nested array of another nested array in object in mongodb

我的问题与这个问题有某种关系LINK。然而这是我的问题..

{
    "_id": ObjectId("4d2d8deff4e6c1d71fc29a07"),
    "comments": [{
            "name": "Len",
            "_id": ObjectId("6241108375ed952ceb0187e3"),
            "data": [{
                "name":"Len",
                "confirmation_likes":"false",
                "_id":ObjectId("6241102d75ed952ceb0187dd")
             },{
                "name":"Lilipad",
                "confirmation_likes":"false",
                "_id":ObjectId("6241102d75ed952ceb0187da")
             }]
        } {
            "name": "Lilipad",
            "_id": ObjectId("6241108375ed952ceb0187e5"),
            "data": [{
                "name":"Len",
                "confirmation_likes":"false",
                "_id":ObjectId("6241102d75ed952ceb0187dd")
             },{
                "name":"Lilipad",
                "confirmation_likes":"false",
                "_id":ObjectId("6241102d75ed952ceb0187da")
             }]
        } {
            "name": "Leni Robredo",
            "_id": ObjectId("6241108375ed952ceb0187e9"),
            "data": [{
                "name":"Len",
                "confirmation_likes":"false",
                "_id":ObjectId("6241102d75ed952ceb0187dd")
             },{
                "name":"Lilipad",
                "confirmation_likes":"false",
                "_id":ObjectId("6241102d75ed952ceb0187da")
             }]
        }
        ...
    ]
}

现在,我想在这里发生的是当您收到评论 _id 时,例如 ObjectId("6241108375ed952ceb0187e3")ObjectId("6241108375ed952ceb0187e5")ObjectId("6241108375ed952ceb0187e9")。我想为他们每个人更新一组新数据,但我很困惑我将如何与操作员一起做。这就是我的输入和输出的工作方式。

parent_id = ObjectId("4d2d8deff4e6c1d71fc29a07")
sub_id = ObjectId("6241108375ed952ceb0187e5")
new_data = [{
                "name":"Len",
                "confirmation_likes":"false",
                "_id":ObjectId("6241102d75ed952ceb0187dd")
             },{
                "name":"Lilipad",
                "confirmation_likes":"false",
                "_id":ObjectId("6241102d75ed952ceb0187da")
             },{
                "name":"Len",
                "confirmation_likes":"false",
                "_id":ObjectId("6241102d75ed952ceb012131")
             }]

输出

{
    "_id": ObjectId("4d2d8deff4e6c1d71fc29a07"),
    "comments": [{
            "name": "Len",
            "_id": ObjectId("6241108375ed952ceb0187e3"),
            "data": [{
                "name":"Len",
                "confirmation_likes":"false",
                "_id":ObjectId("6241102d75ed952ceb0187dd")
             },{
                "name":"Lilipad",
                "confirmation_likes":"false",
                "_id":ObjectId("6241102d75ed952ceb0187da")
             }]
        } {
            "name": "Lilipad",
            "_id": ObjectId("6241108375ed952ceb0187e5"),
            "new_data": [{
                "name":"Len",
                "confirmation_likes":"false",
                "_id":ObjectId("6241102d75ed952ceb0187dd")
             },{
                "name":"Lilipad",
                "confirmation_likes":"false",
                "_id":ObjectId("6241102d75ed952ceb0187da")
             },{
                "name":"Len",
                "confirmation_likes":"false",
                "_id":ObjectId("6241102d75ed952ceb012131")
             }]
        } {
            "name": "Leni Robredo",
            "_id": ObjectId("6241108375ed952ceb0187e9"),
            "data": [{
                "name":"Len",
                "confirmation_likes":"false",
                "_id":ObjectId("6241102d75ed952ceb0187dd")
             },{
                "name":"Lilipad",
                "confirmation_likes":"false",
                "_id":ObjectId("6241102d75ed952ceb0187da")
             }]
        }
        ...
    ]
}

如您所见,我使用 sub_id 来获取要更新其数据的数组项的 ID。因为我可以使用相同的名称但不能使用 ID,所以这就是我使用的原因comments.

的数组项的 _id

现在如果我想在评论数组的所有 id 中传递新的所有数据..我已经为此准备了一个循环让我们说这样的话。

list_comment_id = [ObjectId("6241108375ed952ceb0187e3"),
ObjectId("6241108375ed952ceb0187e5"),ObjectId("6241108375ed952ceb0187e9")]

parent_id = ObjectId("4d2d8deff4e6c1d71fc29a07")
new_data = [{
                "name":"Len",
                "confirmation_likes":"false",
                "_id":ObjectId("6241102d75ed952ceb0187dd")
             },{
                "name":"Lilipad",
                "confirmation_likes":"false",
                "_id":ObjectId("6241102d75ed952ceb0187da")
             },{
                "name":"Len",
                "confirmation_likes":"false",
                "_id":ObjectId("6241102d75ed952ceb012131")
             }]

这样我就可以传递我的 list_comment_id 想要的所有数据..

我已经在我的代码中尝试过类似的东西

router.route('/append/:id').put((req,res) => {
    const { _id, sub_id, data} = req.body
    const main_id = req.params.id

    // Sub_id for comments _id items
    COMMENT.updateOne(
        {
            _id:main_id,
            "comments._id" : sub_id
        },
        {
            $set:{
                data:data
            }
        }
    ).then((comments) => res.json("Likes List People Updated") )
    .catch(err => console.log(err))

})

谁能帮帮我谢谢??我将不胜感激。

也许是这样的:

db.collection.update({
 _id: ObjectId("4d2d8deff4e6c1d71fc29a07")
},
{
$set: {
"comments.$[x]": {
  "name": "Lilipad",
  "_id": ObjectId("6241108375ed952ceb0187e5"),
  "new_data": [
    {
      "name": "Len",
      "confirmation_likes": "false",
      "_id": ObjectId("6241102d75ed952ceb0187dd")
    },
    {
      "name": "Lilipad",
      "confirmation_likes": "false",
      "_id": ObjectId("6241102d75ed952ceb0187da")
    },
    {
      "name": "Len",
      "confirmation_likes": "false",
      "_id": ObjectId("6241102d75ed952ceb012131")
    }
   ]
  }
 }
},
{
 arrayFilters: [
 {
    "x._id": ObjectId("6241108375ed952ceb0187e5")
 }
]
})

解释: 创建 arrayFilters x 以识别需要更新的元素并使用必要的值进行更新。

playground