【问题标题】:mongoDB: Querying for documents that may have some specifics optionsmongoDB:查询可能具有某些特定选项的文档
【发布时间】:2017-11-08 07:08:02
【问题描述】:

我对 mongodb 还很陌生,但有一件事我现在无法解决: 假设您有以下文档结构:

{
"_id": ObjectId("some object id"),
name: "valueName",
options: [
    {idOption: "optionId", name: "optionName"},
    {idOption: "optionId", name: "optionName"}
]
}

每个文档可以有多个已经分类的选项。

我正在尝试获取集合中的所有文档,这些文档至少具有我为查询传递的多个选项中的一个。

我正在尝试使用运营商$elemMatch 类似这样的东西:

db.collectioName.find({"options.name": { $elemMatch: {"optName1","optName2"}}})

但它从不向我显示匹配文件。

有人可以帮我看看我做错了什么吗? 谢谢!

【问题讨论】:

    标签: mongodb mongodb-query


    【解决方案1】:

    给定一个包含以下文档的集合:

    {
        "_id" : ObjectId("5a023b8d027b5bd06add627a"),
        "name" : "valueName",
        "options" : [ 
            {
                "idOption" : "optionId",
                "name" : "optName1"
            }, 
            {
                "idOption" : "optionId",
                "name" : "optName2"
            }
        ]
    }
    
    {
        "_id" : ObjectId("5a023b9e027b5bd06add627d"),
        "name" : "valueName",
        "options" : [ 
            {
                "idOption" : "optionId",
                "name" : "optName3"
            }, 
            {
                "idOption" : "optionId",
                "name" : "optName4"
            }
        ]
    }
    

    这个查询...

    db.collection.find({"options": { $elemMatch: {"name": {"$in": ["optName1"]}}}})
    

    .. 将只返回第一个文档。

    虽然,这个查询...

    db.collection.find({"options": { $elemMatch: {"name": {"$in": ["optName1", "optName3"]}}}})
    

    ...将返回两个文档。

    第二个例子(我认为)符合这个要求:

    我正在尝试获取集合中的所有文档,这些文档至少具有我为查询传递的多个选项中的一个。

    【讨论】:

    • 或者实际上只是.find({ "options.name": { "$in": ["optName1", "optName3"] } }),因为$elemMatch在“相同数组元素”需要“多个条件”的情况下才需要。这里的查询只需要在数组中的“某处”生成“任意”值。请参阅Specify Multiple Conditions for Array of Documents,其中解释了差异。
    猜你喜欢
    • 1970-01-01
    • 2022-01-17
    • 1970-01-01
    • 1970-01-01
    • 2015-02-13
    • 2013-09-10
    • 2023-03-16
    • 1970-01-01
    • 2014-10-12
    相关资源
    最近更新 更多