MongoDB:从一个数组中删除对象,并将其附加到同一父文档中的另一个数组中

问题描述 投票:0回答:1

我有一个存储_id(ObjectId()),messages(对象数组)和Deleted(对象数组)的集合,如下所示:

{

   _id: ObjectId("5ea54a39adb83732b057cd12"),

   messages: [
               {
                  msgID: ObjectId("5ea54a39adb83732b057cd89") 
                  msg: "This is a demo message - 1"
               },
               {
                  msgID: ObjectId("5ea54a39adb83732b057ce90") 
                  msg: "This is a demo message - 2"
               },
               {
                  msgID: ObjectId("5ea54a39adb83732b057ce85") 
                  msg: "This is a demo message - 3"
               }
            ],

   deleted: []

}

现在,我正在尝试根据msgID从邮件数组中删除一个对象,并将其放入已删除的数组中。什么是实现这一目标的最佳方法。例如假定将删除具有mID:ObjectId(“ 5ea54a39adb83732b057ce85”)的消息,因此此后的文档应类似于:

{

   _id: ObjectId("5ea54a39adb83732b057cd12"),

   messages: [
               {
                  msgID: ObjectId("5ea54a39adb83732b057cd89") 
                  msg: "This is a demo message - 1"
               },
               {
                  msgID: ObjectId("5ea54a39adb83732b057ce90") 
                  msg: "This is a demo message - 2"
               }
            ],

   deleted: [
               {
                  msgID: ObjectId("5ea54a39adb83732b057ce85") 
                  msg: "This is a demo message - 3"
               }
            ]

}

注意:我正在使用Node.JS制作应用程序并实现此目的,以便用户可以在一段时间内撤消已删除的消息。

arrays mongodb
1个回答
0
投票

您可以执行类似的操作,并且可以正常工作

db.test.update(
    {_id: ObjectId("5ea54a39adb83732b057cd12")},
    [{$set:{
        messages:{
            $filter:{
                input:"$messages",
                cond: {$ne : ["$$this.msgID",ObjectId("5ea54a39adb83732b057ce85")]}
            }
        },
        deleted:{$concatArrays:[
            "$deleted",
            [{
                "$arrayElemAt" : [
                    {
                        "$filter" : {
                            "input" : "$messages",
                            "cond" : {
                                "$eq" : [
                                    "$$this.msgID",
                                    ObjectId("5ea54a39adb83732b057ce85")
                                ]
                            }
                        }
                    },
                    0
                ]
            }]
        ]}
    }}]
)
© www.soinside.com 2019 - 2024. All rights reserved.