【问题标题】:Query Mongo document array based on another array in the same document根据同一文档中的另一个数组查询 Mongo 文档数组
【发布时间】: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 有效载荷的响应。现在我想过滤集合并希望得到响应reasonCode是AVJPA的有效载荷。如何做到这一点?我正在使用以下代码来找出存在Error 的响应,但不确定如何找到与响应对应的有效负载。

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

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

【问题讨论】:

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

标签: arrays mongodb mongodb-query nosql pymongo


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-12
    • 1970-01-01
    • 2020-07-26
    • 1970-01-01
    • 1970-01-01
    • 2015-03-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多