我有一个存储_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制作应用程序并实现此目的,以便用户可以在一段时间内撤消已删除的消息。
您可以执行类似的操作,并且可以正常工作
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
]
}]
]}
}}]
)