当父键未知时,按值查询MongoDB

时间:2016-10-10 18:45:48

标签: mongodb mongodb-query

我有一个名为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();

并且两者都没有返回。

2 个答案:

答案 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();

$用于深入搜索类别下的任何元素。

有关详细信息,请参阅:$matchelement match