【问题标题】:MongoDB : Find document where none of the subdocument matches criteriaMongoDB:查找没有子文档符合条件的文档
【发布时间】:2020-07-25 13:58:03
【问题描述】:

我想找出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 不存在

只有 2 个 Record A 存在,FLD1 存在且 FLD1 的值等于 VAL2

{
    _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】:

    看起来您需要 $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 和 @ 987654332@:

    Mongo Playground

    【讨论】:

    • 谢谢@mickl,我不得不稍微修改一下,请参阅提供的答案
    【解决方案2】:

    谢谢@mickl

    我不得不稍微修改一下答案。

    {
          $nor: [
            {
              $and: [
                {
                  "Records": {
                    $elemMatch: {
                      "RecordName": "Record A"
                    }
                  }
                },
                {
                  "Records.Properties.FLD1": {
                    $exists: true
                  }
                },
                {
                  "Records": {
                    $elemMatch: {
                      "Properties.FLD1": "VAL2"
                    }
                  }
                }
              ]
            }
          ]
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-09
      • 2014-01-14
      • 2017-04-24
      • 1970-01-01
      • 2019-12-30
      • 2015-05-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多