英文:
MongoDB 4.4 match with group by array query according to structure
问题
这是您的MongoDB聚合管道查询的翻译,该查询可以满足您的需求:
db.collection.aggregate([
  {
    $match: {
      contentType: "Json",
      code: { $in: [200, 404] } // Filter by status codes 200 and 404
    }
  },
  {
    $group: {
      _id: {
        code: "$code", // Group by status code
        fieldName: "$fieldName",
        location: "$location"
      },
      values: {
        $push: "$value"
      }
    }
  },
  {
    $group: {
      _id: "$_id.code", // Group by status code again
      samples: {
        $push: {
          location: "$_id.location",
          field: "$_id.fieldName",
          values: "$values"
        }
      }
    }
  },
  {
    $project: {
      _id: 0,
      code: "$_id",
      samples: {
        $slice: ["$samples", 5] // Limit to the first 5 samples
      }
    }
  },
  {
    $group: {
      _id: null,
      data: {
        $push: "$$ROOT"
      }
    }
  },
  {
    $project: {
      _id: 0,
      data: 1
    }
  }
])
这个聚合管道查询将根据您的要求对文档进行过滤、分组和限制,并按您所需的结构返回结果。
英文:
Working on mongodb 4.4 version Lets say my collection looks like:
  [
  {
    "_id": ObjectId("6451529ad254d565bd12156b"),
    "contentType": "Json",
    "fieldName": "xxx",
    "method": "GET",
    "value": "Car",
    "location": "header",
    "code": 404
  },
  {
    "_id": ObjectId("6451529ad254d565bd12156d"),
    "contentType": "Json",
    "fieldName": "xxx",
    "method": "GET",
    "value": "Plane",
    "location": "header",
    "code": 404
  },
  {
    "_id": ObjectId("6451529ad254d565bd121570"),
    "contentType": "Json",
    "fieldName": "yyy",
    "method": "GET",
    "value": "Smile",
    "location": "header",
    "code": 404
  },
  {
    "_id": ObjectId("6451529ad254d565bd13156b"),
    "contentType": "Empty",
    "fieldName": "zzz",
    "method": "POST",
    "value": "Train",
    "location": "header",
    "code": 200
  },
  {
    "_id": ObjectId("6451529ad254d5651112156a"),
    "contentType": "Empty",
    "fieldName": "zzz",
    "method": "POST",
    "value": "Player",
    "location": "body",
    "code": 200
  },
  {
    "_id": ObjectId("6451529ad254d565bd12166d"),
    "contentType": "Empty",
    "fieldName": "zzz",
    "method": "POST",
    "value": "Van",
    "location": "body",
    "code": 404
  },
  {
    "_id": ObjectId("6451529ad254d565bd121670"),
    "contentType": "Json",
    "fieldName": "name4",
    "method": "GET",
    "value": "Van",
    "location": "body",
    "code": 200
  }
]
I'd like to request mongo with
{ contentType: Json   codes:  [ 200, 404  ] }
for example i want to filter all documents with contentType:Json and codes 200,404
and group by fieldName with limit 5
the response of this request should look like :
{
  data: [
    {
      code: 200,
      samples: [
        {
          location: “header”,
          “field”: fieldName1,
          values: [
            x1,
            x2, // limit 5
          ]
        },
      {
        location: “headers”,
        field: fieldName2,
        values: [
          y1,
          y2,
          y3 // .. limit 5
      	]
      }
    } ,
    
    {
      code: 404,
      samples: [
        {
          location: “body”,
          “field”: fieldName1,
          values: [
            x1,
            x2 // .. limit 5
          ]
        },
      {
        location: “headers”,
        field: fieldName2,
        values: [
          y1,
          y2,
          y3 .. // limit 5
      	]
      }
    }
  ]
}
tried to do like this but it is not completed https://mongoplayground.net/p/sPk2lViV26l
 db.collection.aggregate([
  {
    $match: {
      contentType: "Json"
    }
  },
  {
    $group: {
      _id: {
        fieldName: "$fieldName",
        location: "$location"
      },
      values: {
        $push: "$value"
      }
    }
  },
  {
    $replaceRoot: {
      newRoot: {
        $mergeObjects: [
          "$_id",
          {
            values: "$values"
          }
        ]
      }
    }
  }
])
which gives me
[
  {
    "fieldName": "xxx",
    "location": "header",
    "values": [
      "Car",
      "Plane"
    ]
  },
  {
    "fieldName": "name4",
    "location": "body",
    "values": [
      "Van"
    ]
  },
  {
    "fieldName": "yyy",
    "location": "header",
    "values": [
      "Smile"
    ]
  }
]
but I need it as array with status code as in the response structure
答案1
得分: 1
以下是您要翻译的内容:
"我对所需的分组不是完全清楚,但根据我的理解,以下是一种方法。"
db.collection.aggregate([
  {
    "$match": {
      "contentType": "Json",
      "code": {"$in": [200, 404]}
    }
  },
  {
    "$group": {
      "_id": {
        "code": "$code",
        "field": "$fieldName",
        "location": "$location"
      },
      "values": {"$push": "$value"}
    }
  },
  {
    "$group": {
      "_id": "$_id.code",
      "samples": {
        "$push": {
          "field": "$_id.field",
          "location": "$_id.location",
          "values": {"$slice": ["$values", 5]}
        }
      }
    }
  },
  {
    "$group": {
      "_id": null,
      "data": {
        "$push": {
          "code": "$_id",
          "samples": "$samples"
        }
      }
    }
  },
  {"$unset": "_id"}
])
在mongoplayground.net上尝试它。
英文:
The desired grouping isn't completely clear to me, but using my interpretation, here's one way to do it.
db.collection.aggregate([
  {
    "$match": {
      "contentType": "Json",
      "code": {"$in": [200, 404]}
    }
  },
  {
    "$group": {
      "_id": {
        "code": "$code",
        "field": "$fieldName",
        "location": "$location"
      },
      "values": {"$push": "$value"}
    }
  },
  {
    "$group": {
      "_id": "$_id.code",
      "samples": {
        "$push": {
          "field": "$_id.field",
          "location": "$_id.location",
          "values": {"$slice": ["$values", 5]}
        }
      }
    }
  },
  {
    "$group": {
      "_id": null,
      "data": {
        "$push": {
          "code": "$_id",
          "samples": "$samples"
        }
      }
    }
  },
  {"$unset": "_id"}
])
Try it on [mongoplayground.net](https://mongoplayground.net/p/Jyiq11sS1es "Click me!").
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。


评论