我在 Mongo 中有一个结构已知的集合。 它包括
{
"_id" : "123456__data",
"fields" : {
"field1" : {
"type" : "boolean",
"writeAccess" : "someWriteAccess",
},
"field2" : {
"type" : "integer",
"writeAccess" : "secondWriteAccess",
},
"field3" : {
"someConcretePermissionOperation" : "set",
"writeAccess" : "thirdWriteAccess",
}
}
}
现在我必须找到所有文档,最好是“someConcretePermissionOperation”的所有具体值,而“field1”、2、3 可以由用户决定。也就是说,在不同的文档中,它们可以有不同的名称。我唯一知道的是恒定深度 - 如果 someConcretePermissionOperation 出现,它将在 fields.XXX.someConcretePermissionOperation
下,其中 XXX 可以是任何东西。
有人有什么想法吗?
刚找到与我正在寻找的东西接近的东西:
var operationOptions = [ "push", "set", "pushUnique" ];
db.mytable.aggregate(
[
{ $redact:
{
$cond:
{
if: { $gt: [ { $size: { $setIntersection: [ "$someConcretePermissionOperation", operationOptions ] } }, 0 ] },
then: "$$DESCEND",
else: "$$PRUNE"
}
}
}
]
)
但是收到
未捕获的异常:聚合失败:{
“errmsg”:“异常:$size 的参数必须是数组,但类型为:NULL”,
还不知道如何在这个聚合查询中写“如果存在,否则忽略”。
最佳答案
使用 $ifNull
运算符检查字段是否不是数组或不存在:
var operationOptions = [ "push", "set", "pushUnique" ];
db.mytable.aggregate(
[
{ $redact:
{
$cond:
{
if: {
$gt: [
{
$size: {
"$ifNull": [
{ $setIntersection: ["$someConcretePermissionOperation", operationOptions] },
[]
]
}
},
0
]
},
then: "$$DESCEND",
else: "$$PRUNE"
}
}
}
]
)
关于mongodb - 当确切路径未知时在 MongoDb 中搜索字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27896594/