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您可以尝试下面的查询,这样您的结果中的文档数量可能会多于集合中的实际数量,因为我们正在爆炸项目数组:
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)
参考: 聚合管道