如果id在数组中,MongoDB管道$unset字段



给定如下条目列表,如果_id在myArray中,我希望在管道阶段$unset platformA。

const myArray='5f22f9ac6ee02a707cf0586']

db.profiles.findOne({_id:ObjectId("5f22f9ac6ee02a707cf0586"(}(

{
"_id" : ObjectId("5f22f9ac6ee02a6707cf0586"),
"platformA" : {
...
},
"platformB": {
...
}
}

因此,项目结束后的结果是

{
"_id" : ObjectId("5f22f9ac6ee02a6707cf0586")
"platformB": {
...
}
}

我不明白如果$_id字段不在myArray中,我如何访问它并有条件地将$project platformA设置为0。

{
// only show platformA when not in myArray
$project: {
platformA: 0
}
},

终于想好了怎么做。

{
// only show platformA when id is not in myArray
$project: {
platformA: {
$cond: [{$setIsSubset: [['$_id'], myArray]}, 0, 1 ] }
}
}
},
{
$match: {
$and: [{
platformA: {$ne: 0}
}, {
platformB: {$ne: 0}
}]
}
}

@user3586358,回答自己的问题很好,如果你对此感到满意,那也没关系,但我已经准备了一些关于这方面的研究,所以我想向你展示,这可能对其他人有帮助,

假设这是ids数组,

let myArray = [1,2,3];

与find((一起使用

  • 使用$cond$in
db.collection.find(
{},
{
_id: 1,
name: 1,
platformB: 1,
platformA: {
$cond: [
{$in: ["$_id", myArray]},
0,
"$platformA"
]
}
})

工作游乐场:https://mongoplayground.net/p/OgvD_V0qn_H

与aggregate((一起使用

db.collection.aggregate([
{
$project: {
_id: 1,
name: 1,
platformB: 1,
platformA: {
$cond: [
{$in: ["$_id", myArray]},
0,
"$platformA"
]
}
}
}
])

工作游乐场:https://mongoplayground.net/p/753MKWPUJmC

最新更新