Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MongoDB

ดึงค่าทั้งหมดจากอาร์เรย์ซ้อนมาแสดงในบรรทัดเดียวด้วย MongoDB Aggregation

ใช้ $unwind 2 ครั้ง (แยกอาร์เรย์นอก แล้วแยกอาร์เรย์ใน) แล้ว $group + $push รวมค่าทั้งหมดเป็นอาร์เรย์เดียว

ตัวอย่างข้อมูลทดสอบ (อาร์เรย์ซ้อน 2 ชั้น)

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

แสดงข้อมูล

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

คำสั่ง Aggregation แปลงเป็นอาร์เรย์แบน (Flatten)

> 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"}}
])

ผลลัพธ์ (อาร์เรย์เดียวรวมทุกชื่อ)

{
    "NameArray" : ["Chris", "David", "Bob", "Mike", "Carol", "Sam", "David", "John"]
}

คำอธิบาย:

  1. $unwind: "$details" แยกอาร์เรย์นอก (4 เอกสาร)
  2. $unwind: "$details.Name" แยกอาร์เรย์ใน (8 เอกสาร)
  3. $project เลือกเฉพาะ Name
  4. $group รวม Name ทั้งหมดด้วย $push
  5. $project จัดรูปแบบผลลัพธ์