MongoDB - 将数组拆分为多个文档并用数组的对象替换现有文档

hum*_*ing 3 mongodb mongodb-query aggregation-framework

我收集了一个大的 json 文档,如下所示:

\n\n
{\n  "_id": {\n    "$oid": "5e7a50e7f1d41b3ea05aa46e"\n  },\n  "response": {\n    "count": 2,\n    "items": [\n      {\n        "id": 1,\n        "first_name": "Unknown",\n        "last_name": "Unknown",\n        "is_closed": false,\n        "can_access_closed": true,\n        "photo": "1.jpg",\n        "track_code": "d9e2ca2eG4GbHAQSwz8Ne4WBiVx"\n      },\n      {\n        "id": 2,\n        "first_name": "Lorem",\n        "last_name": "Ipsum",\n        "is_closed": false,\n        "can_access_closed": true,\n        "photo": "2.jpg",\n        "track_code": "23f1219a7j1xyWba69jz7p"\n      }\n    ]\n  }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

如何按集合中的各个对象(例如按项目中的 id)拆分“项目”?\n因此我想要这样的东西:

\n\n

对象#1

\n\n
{\n  "_id": {\n    "$oid": "5e7a50e7f1d41b3ea05aa46e"\n  },\n  "id": 1,\n  "first_name": "Unknown",\n  "last_name": "Unknown",\n  "is_closed": false,\n  "can_access_closed": true,\n  "photo": "1.jpg",\n  "track_code": "d9e2ca2eG4GbHAQSwz8Ne4WBiVx"\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

对象#2

\n\n
{\n  "_id": {\n    "$oid": "ae2a40e7ffd41b3ea05aa46e"\n  },\n  "id": 2,\n  "first_name": "Lorem",\n  "last_name": "Ipsum",\n  "is_closed": false,\n  "can_access_closed": true,\n  "photo": "2.jpg",\n  "track_code": "23f1219a7j1xyWba69jz7p"\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

我无法理解如何在文档中查找此内容。

\n

sri*_*asy 6

您可以尝试下面的查询,这样您的结果中的文档数量可能会多于集合中的实际数量,因为我们正在爆炸项目数组:

db.collection.aggregate([
  /** Adds '_id' field to each object inside items array, this can be done after 'unwind',
   *  if it's done after 'unwind' no.of docs to be iterated in 'unwind' is more, So better be done as first stage*/
  {
    $addFields: {
      "response.items._id": "$_id"
    }
  },
  /** Unwind items array, will exclude docs where items is not an array/doesn't exists */
  {
    $unwind: "$response.items"
  },
  /** Replace 'response.items' object as new root(document) */
  {
    $replaceRoot: {
      newRoot: "$response.items"
    }
  }
])
Run Code Online (Sandbox Code Playgroud)

测试: MongoDB-Playground

参考: 聚合管道