我需要找到一个文档,其中“组件”不存在或者如果存在,其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个文档的查询。
答案 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}}
]
})