我有一个名为references
的MongoDB集合,其中有一个文档,我需要返回所有具有format
密钥的对象,其值为1
。该文档的一个示例如下所示:
{
"_id" : ObjectId("878f92ad6d9e8089aa3456a9"),
"categories" : {
"1" : {
"format" : 1,
...
}
}
}
我试过这个:
db.references.find({
"_id" : ObjectId("878f92ad6d9e8089aa3456a9"),
"categories.$.format" : 1
}).pretty();
以及:
db.references.find({
"_id" : ObjectId("878f92ad6d9e8089aa3456a9"),
"categories.*.format" : 1
}).pretty();
并且两者都没有返回。
答案 0 :(得分:2)
我认为架构设计并不是很好。具有如下的架构设计:
{
"_id" : ObjectId("57fbe76f78c1638eaebfb21f"),
"categories" : [
{
"cat_name" : 1,
"format" : 1
},
{
"cat_name" : 2,
"format" : 6
}
]
}
更有意义,这样您只需使用点表示法即可访问嵌入类别文档的format
字段。您请求的查询可以是:db.stackQuestion.find({ "categories.format": 1 })
答案 1 :(得分:0)
mongoDB允许使用$exists元素查询运算符检查文档中字段的存在。
使用属性_id意味着您想要在知道其ID时从集合中提取特定文档,以便最多可以返回1个对象。这就是为什么你不应该在查询中使用以下行:
“_ id”:ObjectId(“878f92ad6d9e8089aa3456a9”)
获取包含categories字段的所有文档的简单查询应如下所示:
db.references.findAll( {
categories: { $exists: true }
}).pretty();
通过使用以下查询,您可以在一个查询中获得您希望获得的所有结果:
db.references.find({ categories: { $exists:true },
"categories.$" : { $elemMatch: { "format": "1" } }
}).pretty();
$用于深入搜索类别下的任何元素。
有关详细信息,请参阅:$match,element match,