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

จัดกลุ่มค่าตามฟิลด์อื่นด้วย $group ใน MongoDB

ใช้ $group ร่วม $addToSet สะสมค่า แล้ว $reduce + $concatArrays รวมอาร์เรย์ย่อยเป็นอาร์เรย์เดียว

ตัวอย่างข้อมูลทดสอบ (Chris มี 2 เอกสาร CountryName=US)

> db.demo374.insertOne({"Name":"Chris","HobbyDetails":["Reading Book","Playing Football"],"CountryName":"US"});
> db.demo374.insertOne({"Name":"Chris","HobbyDetails":["Browsing Internet","Playing Football"],"CountryName":"US"});

แสดงข้อมูลทั้งหมด

> db.demo374.find();
{
    "_id" : ObjectId("5e5a04402ae06a1609a00b04"),
    "Name" : "Chris", "HobbyDetails" : ["Reading Book", "Playing Football"], "CountryName" : "US"
}
{
    "_id" : ObjectId("5e5a04402ae06a1609a00b05"),
    "Name" : "Chris", "HobbyDetails" : ["Browsing Internet", "Playing Football"], "CountryName" : "US"
}

คำสั่ง Aggregation จัดกลุ่มตาม Name รวม HobbyDetails

> db.demo374.aggregate([
    {$match: {"CountryName" : "US"}},
    {$group: {"_id" : "$Name", "HobbyDetails" : {$addToSet : "$HobbyDetails"}}},
    {$project: {"_id" : 0, "Name" : "$_id", "HobbyDetails" : {$reduce: {input: "$HobbyDetails", initialValue: [], in: {$concatArrays: ["$$value", "$$this"]}}}}}
]).pretty()

ผลลัพธ์ (รวม HobbyDetails เป็นอาร์เรย์เดียว มีค่าซ้ำ Playing Football)

{
    "Name" : "Chris",
    "HobbyDetails" : [
        "Browsing Internet", "Playing Football", "Reading Book", "Playing Football"
    ]
}

คำอธิบาย:

  • $addToSet สะสมอาร์เรย์ HobbyDetails ทั้งหมด (ได้อาร์เรย์ของอาร์เรย์)
  • $reduce + $concatArrays รวมอาร์เรย์ย่อยเป็นอาร์เรย์เดียว
  • ค่าซ้ำ (Playing Football) จะอยู่ร่วมกัน ใช้ $setUnion แทนถ้าต้องการ distinct