【问题标题】:$in query with $elemMatch in mongoDB在 mongoDB 中使用 $elemMatch 进行 $in 查询
【发布时间】:2018-08-18 12:00:44
【问题描述】:

我需要找到一个文档,其中“组件”不存在,或者如果存在,其 id 为 1111 且 isActive 为真且“问题”不存在,或者其 id 为 1111 且 isActive 为真。

示例: 文档 1:////这包含“组件”但不包含“问题”

{..
 "components" : [ 
        {
            "id" : "1111",
            "name" : "component1",
            "isActive" : true
        }
    ],
}

文档 2://this 包含“问题”但不包含“组件”

{..
 "issues" : [ 
        {
            "id" : "1111",
            "name" : "issue 1",
            "isActive" : true
        }
    ],
..}

文档 3://这两者都没有

查询:

    db.sample.find({
    "issues":{$in:[null, {"$elemMatch" : {"id":"1111","isActive": {"$in":[true,null]}}}]},
    "components":{$in:[null, {"$elemMatch" : {"id":"1111","isActive": {"$in":[true,null]}}}]}
})

但我收到一个错误,“errmsg”:“不能在 $in 下嵌套 $”,

请帮助形成返回所有上述 3 个文档的查询。

【问题讨论】:

    标签: mongodb-query


    【解决方案1】:

    您不需要$in。您需要$or 运算符。

    试试

    db.sample.find({
     $or:[
        {"issues":{$exists:true,"$elemMatch" : {"id":"1111","isActive": true}}},
        {"components":{$exists:true,"$elemMatch" : {"id":"1111","isActive": true}}}
      ]
    })
    

    基于 OP 的 cmets。这是工作版本。

    db.Sample.find({ 
     $or:[
       {"issues":{$exists:true,"$elemMatch":{"id":"1111","isActive":true}},
         "components":{$exists:false} },
       {"components":{$exists:true,"$elemMatch":{"id":"1111","isActive":true}}, 
         "issues":{$exists:false}}, 
       {"issues":{$exists:true,"$elemMatch":{"id":"1111","isActive": true}}, 
        "components":{$exists:true,"$elemMatch":{"id":"1111","isActive":true}}}, 
       {"issues":{$exists:false}, "components":{$exists:false}} 
     ] 
    })
    

    【讨论】:

    • 您的查询将返回具有其他 id 的文档(例如:issues.id = 1111,components.id = 2232),这不是预期的。
    • 试试db.sample.find( {"issues":{$exists:true,"$elemMatch" : {"id":"1111","isActive": true}}, "components":{$exists:true,"$elemMatch" : {"id":"1111","isActive": true}}})
    • 这不会返回我的问题中指出的 3 个文档中的任何一个。
    • db.sample.find({$and:[ {$or:[{"issues" : {"$elemMatch" : {"id":"1111","isActive": true} }},{"issues" : null}]}, {$or:[{"components" : {"$elemMatch" : {"id":"1111","isActive": true}}},{"components " : null}]} ]}) - 这在 roboMongo 中工作,但在 java 中抛出异常,说错误的顶级运算符。所以期待这样的查询
    • 试试db.col.find({ $or:[ {"issues":{$exists:true,"$elemMatch" : {"id":"1111","isActive": true}},"components":{$exists:false} }, {"components":{$exists:true,"$elemMatch" : {"id":"1111","isActive": true}}, "issues":{$exists:false}}, {"issues":{$exists:true,"$elemMatch" : {"id":"1111","isActive": true}}, "components":{$exists:true,"$elemMatch" : {"id":"1111","isActive": true}}} ] })。这还将包括组件和问题都符合标准的文档。
    猜你喜欢
    • 2013-11-24
    • 2016-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多