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");