MongoDB:查找子文档都不符合条件的文档

问题描述 投票:1回答:1

我想找出其中Record A具有"FLD1"并且"FLD1"不等于"VAL2"的文档,这意味着它还应该返回其中Record A不存在或FLD1不存在的文档FLD1之外的其他存在不等于VAL2

在以下文档中,应返回文档1, 34

  • [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。

mongodb mongodb-query nosql mongodb-.net-driver subdocument
1个回答
0
投票

看来您需要$or运算符包含三个单独的过滤条件:

db.collection.find({
    $or: [
        { "Records": { $not : { $elemMatch: { "RecordName": "Record A" } } } },
        { "Records.Properties.FLD1": { $exists: false } },
        { "Records": { $not : { $elemMatch: { "Properties.FLD1": "VAL2" } } } }
    ]
})

$elemMatch$not一起使您可以检查是否所有RecordsRecordName不等于Record A,那么您可以使用$exists检查FLD1,并使用$elemMatch检查另一个$not ]:

Mongo Playground

© www.soinside.com 2019 - 2024. All rights reserved.