0

我必须在 MongoDB 中找到所有包含“p396:branchCode”作为键的文档。值无关紧要,可以是任何东西。我尝试使用

{"p396:branchCode": new RegExp(".*")}

在 MongoVUE 但我什么也没找到。我的数据库非常嵌套,branchCode 具有超级键“p396:checkTellersEApproveStatus”

4

3 回答 3

2

您的密钥嵌套在超级密钥下,因此您需要使用点运算符:

{"p396:checkTellersEApproveStatus.p396:branchCode": {$exists: true}}

这假设p396:branchCode总是在p396:checkTellersEApproveStatus. 如果不是这种情况,您就会遇到问题,因为 MongoDB 不允许对未知键进行查询。当可能的超级键数量较少时,您可以使用 $or-operator 查询所有超级键。如果没有,那么您唯一的选择是将对象重构为数组。举个例子,这样的结构:

properties: {
     prop1: "value1",
     prop2: "value2",
     prop3: "value3"
}

当看起来像这样时,查询任意键下的值会容易得多:

properties: [
     { key: "prop1", value:"value1"} ,
     { key: "prop2", value:"value2"},
     { key: "prop3", value:"value3"}
]

因为你可以做db.collection.find({"properties.value":"value2"})

于 2015-07-15T14:50:54.423 回答
0

听起来你想使用$exists运算符。

{'p396:branchCode': {$exists: true}}

这假设此查询是路径的一部分:

{ 'p396:checkTellersApproveStatus': {'p396:branchCode': {$exists: true}}}

可以缩短为:

{ 'p396:checkTellersApproveStatus.p396:branchCode': {$exists: true}}
于 2015-07-15T14:41:04.560 回答
0

如果您实际上是“混合类型,那么这可能不是一件好事。但是如果您只关心该字段$exists,那么这就是要使用的运算符:

db.collection.find({ 
   "p396:checkTellersApproveStatus.p396:branchCode": { "$exists": true }
})

如果这些值实际上是“所有”数字并且您有预期的“范围”,那么请改用$gt$lt运算符。这允许使用字段上的“索引”。所有文档中都不存在的“稀疏”索引将提高性能:

db.collection.find({
    "p396:checkTellersApproveStatus.p396:branchCode": {
        "$gt": 0, "$lt": 99999
    }
})

在所有情况下,这是父“p396:checkTellersApproveStatus”的“子”,因此您使用“not notation”来访问属性的完整路径。

于 2015-07-15T14:44:10.950 回答