在mongoDB中使用$ elemMatch查询$

时间:2018-03-09 20:40:36

标签: mongodb-query

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

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

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

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

{..
 "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”:“无法将$嵌入$”,

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

1 个答案:

答案 0 :(得分:0)

您不需要$in。您需要$or运营商。

尝试

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

基于OP的评论。这是工作版本。

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}} 
 ] 
})