MongoDB:查找没有子文档符合条件的文档

Posted

技术标签:

【中文标题】MongoDB:查找没有子文档符合条件的文档【英文标题】:MongoDB : Find document where none of the subdocument matches criteria 【发布时间】: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。

【问题讨论】:

【参考方案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"
                
              
            
          ]
        
      ]
    

【讨论】:

以上是关于MongoDB:查找没有子文档符合条件的文档的主要内容,如果未能解决你的问题,请参考以下文章

使用 Mongoose 查找子文档字段部分匹配给定条件的文档

使用 Mongoose 查找子文档字段部分匹配给定条件的文档

只有在满足条件的情况下,有没有办法将子文档推送到 mongodb 数组中?

Mongodb Document : 有没有办法计算有条件的子文档?

MongoDB 在子文档中查找

Mongodb按月查找子文档