mongodb - 当确切路径未知时在 MongoDb 中搜索字段

标签 mongodb mongodb-query

我在 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/

相关文章:

mongodb - $setIsSubset 用于 Mongo 中的常规查询

mongodb - 获取每个 "loglevel"的 "name"计数

mongodb - Golang官方MongoDB驱动程序ObjectID怪异行为

javascript - 确保 MongoDB 中的点赞索引

node.js - Mongoose 创建返回 __v

angularjs - 在 Yeoman 生成器中搜索 angularjs 项目

java - MongoDB:检查与数据库的连接

javascript - 计算连续字段出现的最大数量

mongodb - mongo点符号歧义

java - 如何在mongoquery中展开两个数组