Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MongoDB

Trích xuất tất cả giá trị mảng lồng nhau thành một mảng đơn trong MongoDB

Dùng aggregation pipeline với $unwind (phân tách mảng) lồng nhau 2 lần, sau đó $group với $push để gom thành một mảng đơn.

Tạo collection phức tạp:

> db.demo389.insertOne({
  "details":[
    { "Name":[ "Chris", "David" ] },
    { "Name":[ "Bob", "Mike" ] },
    { "Name":[ "Carol", "Sam" ] },
    { "Name":[ "David", "John" ] }
  ]
});
{ "acknowledged" : true, "insertedId" : ObjectId("5e5d1d8f22064be7ab44e7f9") }

Xem dữ liệu:

> db.demo389.find();

Aggregation làm phẳng (flatten) mảng lồng nhau:

> db.demo389.aggregate([
  { $unwind: "$details" },
  { $unwind: "$details.Name" },
  { $project: { "_id": "$_id", "Name": "$details.Name" } },
  { $group: { _id: "$_id", out: { $push: "$Name" } } },
  { $project: { "_id": 0, "NameArray": "$out" } }
])

Kết quả (mảng đơn 8 phần tử):

Các bước:

  1. $unwind: "$details": tách mảng details thành 4 tài liệu
  2. $unwind: "$details.Name": tách từng mảng Name thành các tài liệu riêng (tổng 8)
  3. $project: chọn trường cần thiết
  4. $group với $push: gom lại thành mảng NameArray

MongoDB 4.4+: Dùng $reduce + $concatArrays trong $project để làm phẳng mà không cần unwind/group (hiệu quả hơn).