【问题标题】:Query MongoDB by value when parent key is unknown父键未知时按值查询MongoDB
【发布时间】:2017-02-19 06:14:38
【问题描述】:

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

这两个都没有返回。

【问题讨论】:

    标签: mongodb mongodb-query


    【解决方案1】:

    mongoDB 可以通过使用$exists 元素查询运算符来检查文档中字段是否存在。

    属性_id的使用意味着当你知道它的id时,你想从集合中提取特定的文档,这样它最多可以返回1个对象。这就是为什么您不应该在查询中使用以下行:

    "_id" : ObjectId("878f92ad6d9e8089aa3456a9")

    获取包含类别字段的所有文档的简单查询应如下所示:

    db.references.findAll( { 
      categories: { $exists: true } 
    }).pretty();
    

    通过使用以下查询,您可以在一个查询中获得您希望获得的所有结果:

    db.references.find({ categories: { $exists:true }, 
                        "categories.$" : { $elemMatch: { "format": "1" } } 
    }).pretty();
    

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

    更多信息请阅读:$matchelement match

    【讨论】:

    • 不幸的是,$elemMatch 仅适用于数组,不适用于文档。所以这并不能回答原来的问题。
    【解决方案2】:

    我认为架构设计不太好。具有如下架构设计:

    {
        "_id" : ObjectId("57fbe76f78c1638eaebfb21f"),
        "categories" : [
            {
                "cat_name" : 1,
                "format" : 1
            },
            {
                "cat_name" : 2,
                "format" : 6
            }
        ]
    }
    

    更有意义,这样您就可以使用点符号访问嵌入类别文档的format 字段。您请求的查询可以是:db.stackQuestion.find({ "categories.format": 1 })

    【讨论】:

    • 我同意结构需要更新,所以我朝那个方向发展。感谢您的建议!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多