根据同一文档中的另一个数组查询 Mongo 文档数组

Posted

技术标签:

【中文标题】根据同一文档中的另一个数组查询 Mongo 文档数组【英文标题】:Query Mongo document array based on another array in the same document 【发布时间】:2020-06-11 06:19:17 【问题描述】:

我有以下格式的 Mongo 文档:


    "_id":
        "$oid":"1237563648fe93j3b5"
    ,
    "stage_id":
        "$oid":"1213241423nn552l54j"
    ,
    "payload":[
        
            "_data":
                "name":"name1",
                "description":"",
                "parent":"",
                "status":"NOT READY"
            
        ,
        
            "_data":
                "name":"name2",
                "description":"MS Visio",
                "parent":"A7704",
                "status":"OPERATING"
            
        ,

        
            "_data":
                "assetnum":"name3",
                "description":"MS Visio",
                "parent":"7127",
                "status":"OPERATING"
            
        
    ],
    "response":[
        
            "_data":
                "Error":
                    "message":"AVJPA - The record already exists. 
                    "attrname":"name",
                    "reasonCode":"AVJPA",
                    "status":"400"
                
            ,
            "_meta":
                "status":"400"
            
        ,
        
            "_data":
                "Error":
                    "message":"AVJPA - The record already exists. 
                    "attrname":"name",
                    "reasonCode":"AVJPA",
                    "status":"400"
                
            ,
            "_meta":
                "status":"400"
            
        ,
        
            "_data":
                "message":"success"
            ,
            "_meta":
                "status":"204"
            
        
    ]

这种格式的文档有很多。 response 数组是对 payload 数组中项目的响应,这些项目已发布到 API 端点。所以响应数组中的index 0 就是payload 数组中index 0 有效载荷的响应。现在我想过滤集合并希望得到响应reasonCodeAVJPA的有效载荷。如何做到这一点?我正在使用以下代码来找出存在Error 的响应,但不确定如何找到与响应对应的有效负载。

logs.find(
    "stage_id":1213241423nn552l54j
    $elemMatch: "_responsedata.Error": $exists: true
)

logs 是我收藏的名称。我在 Python 中运行此代码并使用 PyMongo 客户端库。

【问题讨论】:

请发布预期结果,不清楚您要做什么。是否要返回 payload:[ 索引 0 和 1] ? 没错。但不是索引。这些索引的数据作为一个数组。 【参考方案1】:

检查这是否符合您的要求:

db.logs.aggregate([
  
    $match: 
      "stage_id": ObjectId("5a934e000102030405000001"),
      "response": 
        $elemMatch: 
          "_data.Error": 
            $exists: true
          
        
      
    
  ,
  
    $addFields: 
      tmp: "$payload"
    
  ,
  
    $unwind: 
      path: "$tmp",
      includeArrayIndex: "idx",
      preserveNullAndEmptyArrays: false
    
  ,
  
    $match: 
      $expr: 
        $eq: [
          
            $let: 
              vars: 
                input: 
                  $arrayElemAt: [
                    "$response",
                    "$idx"
                  ]
                
              ,
              in: "$$input._data.Error.reasonCode"
            
          ,
          "AVJPA"
        ]
      
    
  ,
  
    $group: 
      _id: "$_id",
      stage_id: 
        $first: "$stage_id"
      ,
      payload: 
        $push: 
          $arrayElemAt: [
            "$payload",
            "$idx"
          ]
        
      ,
      response: 
        $push: 
          $arrayElemAt: [
            "$response",
            "$idx"
          ]
        
      ,

    
  
])

MongoPlayground

【讨论】:

以上是关于根据同一文档中的另一个数组查询 Mongo 文档数组的主要内容,如果未能解决你的问题,请参考以下文章

更新 mongo 文档数组中的单个子文档的计数

如何匹配 MongoDB 中的子文档数组?

如何使用猫鼬复制字段数据并在同一文档的另一个字段中使用它?

Mongo 查询以查找任何字段元素与任何查询参数元素匹配的文档

Mongo 文档中的更新数组不起作用

如何使用 mongo 聚合循环遍历数组并返回所需的文档?