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

Tạo mảng đơn từ nhiều mảng trong MongoDB bằng $unwind

Khi cần "làm phẳng" (flatten) nhiều mảng thành một luồng các phần tử đơn lẻ, MongoDB cung cấp giai đoạn $unwind trong aggregation pipeline. Toán tử này phân tách mỗi phần tử của mảng thành một tài liệu riêng biệt.

Dữ liệu mẫu

> db.demo289.insertOne({"Section":["A","B","E"],"Name":"Chris"});
{ "acknowledged" : true, "insertedId" : ObjectId("5e4c06fcf49383b52759cbc3") }
> db.demo289.insertOne({"Section":["C","D","B"],"Name":"David"});
{ "acknowledged" : true, "insertedId" : ObjectId("5e4c070af49383b52759cbc4") }

Xem dữ liệu gốc

> db.demo289.find().pretty();
{
    "_id" : ObjectId("5e4c06fcf49383b52759cbc3"),
    "Section" : [ "A", "B", "E" ],
    "Name" : "Chris"
}
{
    "_id" : ObjectId("5e4c070af49383b52759cbc4"),
    "Section" : [ "C", "D", "B" ],
    "Name" : "David"
}

Sử dụng $unwind

> db.demo289.aggregate({ $unwind : "$Section" } );

Kết quả

{ "_id" : ObjectId("5e4c06fcf49383b52759cbc3"), "Section" : "A", "Name" : "Chris" }
{ "_id" : ObjectId("5e4c06fcf49383b52759cbc3"), "Section" : "B", "Name" : "Chris" }
{ "_id" : ObjectId("5e4c06fcf49383b52759cbc3"), "Section" : "E", "Name" : "Chris" }
{ "_id" : ObjectId("5e4c070af49383b52759cbc4"), "Section" : "C", "Name" : "David" }
{ "_id" : ObjectId("5e4c070af49383b52759cbc4"), "Section" : "D", "Name" : "David" }
{ "_id" : ObjectId("5e4c070af49383b52759cbc4"), "Section" : "B", "Name" : "David" }

Lưu ý: Mỗi tài liệu gốc tạo ra số lượng tài liệu mới bằng độ dài mảng Section. Các trường khác (như Name) được giữ nguyên trong mỗi bản sao. Đây là kỹ thuật cơ bản để chuẩn bị dữ liệu cho các phép nhóm (group), lọc (match) hoặc nối (lookup) tiếp theo.