我想找出其中Record A
具有"FLD1"
并且"FLD1"
不等于"VAL2"
的文档,这意味着它还应该返回其中Record A
不存在或FLD1
不存在的文档FLD1
之外的其他存在不等于VAL2
。
在以下文档中,应返回文档1, 3
和4
1
:因为存在Record A
,所以存在FLD1,但FLD1
的值不是VAL2
3
:因为Record A
不存在4
:因为Record A
存在但FLD1
不存在只有Record A
存在,FLD1
存在且FLD1
的值等于VAL2
的2。
{
_id:NumberLong("1"),
Name:"Doc1",
Records: [
{
"RecordName" : "Record A",
"State" : 1,
"Properties" : {
"FLD1" : "VAL1"
}
},
{
"RecordName" : "Record B",
"State" : 1,
"Properties" : {
"FLD2" : "VAL3",
"FLD3" : "VAL2"
}
}
]
},
{
_id:NumberLong("2"),
Name:"Doc2",
Records: [
{
"RecordName" : "Record A",
"State" : 1,
"Properties" : {
"FLD1" : "VAL2"
"FLD4" : "VAL1"
"FLD5" : "VAL6"
}
},
{
"RecordName" : "Record C",
"State" : 1,
"Properties" : {
"FLD1" : "VAL1",
"FLD2" : "VAL3"
}
}
]
},
{
_id:NumberLong("3"),
Name:"Doc3",
Records: [
{
"RecordName" : "Record B",
"State" : 0,
"Properties" : {
"FLD2" : "VAL2"
"FLD3" : "VAL4"
"FLD4" : "VAL5"
}
},
{
"RecordName" : "Record C",
"State" : 1,
"Properties" : {
"FLD3" : "VAL2",
"FLD5" : "VAL4"
}
}
]
},
{
_id:NumberLong("4"),
Name:"Doc4",
Records: [
{
"RecordName" : "Record A",
"State" : 1,
"Properties" : {
"FLD2" : "VAL2"
}
},
{
"RecordName" : "Record C",
"State" : 1,
"Properties" : {
"FLD3" : "VAL3",
"FLD4" : "VAL4"
}
}
]
}
有人知道如何为mongo db编写这样的查询吗?
此外,如果我要查找所有子文档中没有一个记录名称值为Record B
的子文档,我将如何查找?
在这种情况下,查询应返回文档2和4。
看来您需要$or运算符包含三个单独的过滤条件:
db.collection.find({
$or: [
{ "Records": { $not : { $elemMatch: { "RecordName": "Record A" } } } },
{ "Records.Properties.FLD1": { $exists: false } },
{ "Records": { $not : { $elemMatch: { "Properties.FLD1": "VAL2" } } } }
]
})
$elemMatch和$not一起使您可以检查是否所有Records
的RecordName
不等于Record A
,那么您可以使用$exists检查FLD1
,并使用$elemMatch
检查另一个$not
]: