Php 查询数组中的键

Php 查询数组中的键,php,mongodb,mongodb-query,Php,Mongodb,Mongodb Query,我的文档结构如下所示: { "_id": ObjectId("123781236712"), "statistic": { "1": { "key1": "value1", "key2": "value2", (...) }, "5": { "key1": "value1", "key2": "value2", (...) } } } 我现在正在尝试编

我的文档结构如下所示:

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

  }

}
我现在正在尝试编写一个查找,它将为我提供所有包含
统计信息的文档。5
,无论“5”的内容是什么

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

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

提前谢谢

正确的解决方案是:

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

正如刚才所说,不能在非数组的对象上使用数组运算符。此外,MongoDB术语中的“关联数组”或“散列”或“子文档”对于尝试和查询来说都是坏消息

假设您想要查询“key3”等于“value9”的内容。在当前格式中,您必须执行以下操作:

db.collection.find({
“$or”:[
{“statistic.1.key3”:“value9”},
{“statistic.5.key3”:“value9”},
…//对于每个可能的键,依此类推
]
})
如果您有这样一个数组:

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

  }

}
{
“_id”:“随便什么”,
“统计”:[
{“索引”:1,“键1”:“值1”},
{“索引”:1,“键1”:“值2”},
{“索引”:5,“键1”:“值1”},
{“索引”:5,“键3”:“值9”}
]
}
那么,您只需执行以下操作即可进行查询:

db.collection.find({
“statistic.key3”:“value9”
})
简单

我现在正试图撰写一个发现,让我找到所有 包含一个统计数据。5,无论“5”的内容是什么

对于这个问题(使用您当前的文档结构),您发布的查询将非常有效:

db.statistics.find({"statistic.5":{$exists:true}});
您的查询基本上是查看文档中是否存在密钥,而这正是您在问题中提出的问题

但是,对于某些查询,您当前的文档结构并不实用(这是Neil在回答中建议的),并且有一种替代方法可以组织您的文档结构,使用MongoDB更灵活、更容易查询

我将建议一种与Neil的结构稍有不同的结构:

{
    "_id": ObjectId("..."),
    "statistic": [
        { "key1": "value1", "key2" : "value2" },
        { "key1": "value3", "key2" : "value4" },
        { "key1": "value5", "key2" : "value6" }
        /* etc ... */
    ]
} 
创建子文档数组(而不是创建具有散列键值对的对象)将使您能够对文档执行以下查询

这将等同于您的查询(以及您要查找的内容):

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

如果子文档的任何包含具有特定值的键(当前结构不支持该值),您也可以进行搜索:


这是对数组外观的PHP解释吗?或者这实际上是mongodb shell中的数据吗?如果是后者,那么它们实际上不是数组。@NeilLunn这是mongodb shell中的实际表示形式。这些值是作为php中的关联数组插入的,比如:array(“statistic”=>array(“5”=>array(…)))我想我解决了这个问题,这要感谢您的宽泛提示,它们不是实际的数组;)不,不是。这不是一个数组。语法是有效的,但您需要为每个项显式地执行该操作。这不是您想要的解决方案。请阅读所说的内容。当然可以,但这不是你想要的。那我想要什么呢?我对mongodb不是很有经验,但这似乎给了我一个正确的解决方案。什么是更好的方法?这是正确的答案,但不是针对这个问题。问题其实在于这个问题。要么修正这个问题,要么把它全部删除。谢谢你的详细回答。问题是,我从一个api中以json的形式获取这些数据,这些数据被稍微修改,然后存储在MongoDB中。由于我必须能够再次以完全相同的格式提供它,仅用于存储它的折射并不是一个真正的选项。像上面这样的查询无论如何都不会经常进行(仅用于统计目的)。@danijoo没问题:)在这种情况下,更改模式就没有意义了。
db.coll.find({"statistic" : { $size : 5}});
db.coll.find({"statistic.key1" : "value3");