ใช้ $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