我的文档结构如下:
{
"_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"}})
提前感谢!
答案 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");