Mongodb-删除嵌入文档中的一些数组元素
有两种文档。 类型1。文档包含MCN-ONE、MCN-TWO、MCN-three或all 3以及其他值 2.另一种类型的文档不包含这些值中的任何值。 首先,我想得到那些数组元素为1或2或全部为3的文档。然后我想保留MCN-1,MCN-2,MCN-3并批量删除所有其他CCC-ALARM…等。你能帮我写这个查询吗?下面提到的文件属于类型1Mongodb-删除嵌入文档中的一些数组元素,mongodb,Mongodb,有两种文档。 类型1。文档包含MCN-ONE、MCN-TWO、MCN-three或all 3以及其他值 2.另一种类型的文档不包含这些值中的任何值。 首先,我想得到那些数组元素为1或2或全部为3的文档。然后我想保留MCN-1,MCN-2,MCN-3并批量删除所有其他CCC-ALARM…等。你能帮我写这个查询吗?下面提到的文件属于类型1 { "_id" : ObjectId("5d721f5296eaaafd1df263e8"), "assetId" : "ALL", "createdTime"
{
"_id" : ObjectId("5d721f5296eaaafd1df263e8"),
"assetId" : "ALL",
"createdTime" : ISODate("2019-09-06T08:56:50.065Z"),
"default" : false,
"lastUpdatedTime" : ISODate("2019-09-06T09:11:35.463Z"),
"preferences" : {
"MCN-TWO" : [
"TEST"
],
"MCN-ONE" : [
"TEST",
"TEST",
"TEST"
],
"MCN-THREE" : [
"TEST"
],
"CCC-ALARM" : [
"TEST"
],
"SSD-ALARM" : [
"TEST"
],
"TFT-ALARM" : [
"TEST",
"TEST"
],
"REC-WARN" : []
}
}
通用方法是使用$objectToArray转换首选项子文档,然后使用$filter、$map或$reduce过滤所需元素,并使用$arrayToObject转换回。但是,您的需求是获取元素MCN-1、MCN-2、MCN-3。最简单的方法是更新元素首选项,只替换为MCN-ONE、MCN-TWO、MCN-THREE的conten。这可以通过以下聚合完成: 要筛选文档,请设置$match阶段:
你能解释一下这个问题吗?谢谢你的解释。看起来我没有正确解释我的用例。更新了问题。根据你所问的,解决方案仍然是一样的。但是我怀疑,上面的查询也会更新我不想接触的类型2文档。我错了吗?看看我的答案$集合是在MongoDB 4.2中添加的,请改用$addFields。
db.collection.aggregate(
[
{
$match: {
$expr: {
$or: [
{ $ne: ["$preferences.MCN-ONE", null] },
{ $ne: ["$preferences.MCN-TWO", null] },
{ $ne: ["$preferences.MCN-THREE", null] }
]
}
}
},
{
$set: {
preferences: {
$mergeObjects: [
{ "MCN-ONE": "$preferences.MCN-ONE" },
{ "MCN-TWO": "$preferences.MCN-TWO" },
{ "MCN-THREE": "$preferences.MCN-THREE" }
]
}
}
}
]
)