查询数组中的键

时间:2014-06-26 12:09:08

标签: php mongodb mongodb-query

我的文档结构如下:

{
  "_id": ObjectId("123781236712"),
  "statistic": {
    "1": {
        "key1": "value1",
        "key2": "value2",
        (...)
    },
    "5": {
        "key1": "value1",
        "key2": "value2",
        (...)
    }

  }

}

我现在正在尝试撰写一个包含statistic.5的所有文档的查找,无论“5”的内容是什么。

到目前为止,我尝试过没有成功:

db.statistics.find({"statistic": {$elemMatch: {$in:["5"]}}})
db.statistics.find({"statistic": {$elemMatch: "5"}})

提前感谢!

3 个答案:

答案 0 :(得分:1)

正确的解决方案是:

db.statistics.find({"statistic.5":{$exists:true}});

答案 1 :(得分:0)

就像你刚刚被告知的那样,你不能在不是数组的东西上使用数组运算符。 MongoDB中的“关联数组”或“哈希”或“子文档”也是尝试和查询的坏消息。

考虑您要查询“key3”等于“value9”的内容。在您当前的格式中,您必须这样做:

db.collection.find({
   "$or": [
       { "statistic.1.key3": "value9" },
       { "statistic.5.key3": "value9" },
       ... // and so on for every possible key
   ]
})

如果您有这样的数组:

{
    "_id": "whatever",
    "statistic": [
        { "index": 1, "key1": "value1" },
        { "index": 1, "key1": "value2" },
        { "index": 5, "key1": "value1" },
        { "index": 5, "key3": "value9" }
    ]
}

然后你需要做的就是:

db.collection.find({
    "statistic.key3": "value9"
})

简单。

答案 2 :(得分:0)

  

我现在正试图撰写一份能够提供所有文件的发现   包含统计数据.5,无论" 5"。

的内容是什么

对于这个确切的问题(使用您当前的文档结构),您发布的查询将完美运行:

db.statistics.find({"statistic.5":{$exists:true}});

您的查询基本上会查看文档中是否存在密钥,这正是您在问题中提出的问题。

但是,您当前的文档结构对于某些查询来说并不实用(这是Neil在他的回答中提出的建议),并且还有另一种方法可以组织您的文档结构。使用MongoDB灵活且易于查询。

我建议的结构与尼尔的结构略有不同:

{
    "_id": ObjectId("..."),
    "statistic": [
        { "key1": "value1", "key2" : "value2" },
        { "key1": "value3", "key2" : "value4" },
        { "key1": "value5", "key2" : "value6" }
        /* etc ... */
    ]
} 

创建子文档数组(而不是创建具有散列键值对的对象)将使您能够对文档执行以下查询。

这相当于您的查询(以及您正在寻找的内容):

db.coll.find({"statistic.5" : { $exists : 1}});

您还可以检查数组的大小(如果数组恰好包含X项):

db.coll.find({"statistic" : { $size : 5}});

您还可以搜索任何子文档是否包含具有特定值的键(这是您当前结构不支持的键):

db.coll.find({"statistic.key1" : "value3");