ใช้ $reduce รวมค่าในอาร์เรย์เป็น string แล้ว $concat รวมกับฟิลด์อื่น ใน aggregation pipeline สร้างคอลเลกชันตัวอย่าง:
> db.demo359.insertOne({
Name1: "Chris",
Name2: "David",
Subjects: ["MySQL","MongoDB","Java"]
});
{ "acknowledged" : true, "insertedId" : ObjectId("5e5694cdf8647eb59e5620d0") }
แสดงข้อมูล:
> db.demo359.find().pretty();
คิวรีรวม Subjects ด้วย space แล้วต่อกับ Name1:
> db.demo359.aggregate([
{ $project: {
values: {
$reduce: {
input: '$Subjects',
initialValue: '',
in: { $concat: ['$$value', ' ', '$$this'] }
}
},
Name1: 1
}},
{ $project: {
'ConcatResult': { '$concat': ['$Name1', '$values'] }
}}
])
ผลลัพธ์:
{ "_id" : ObjectId("5e5694cdf8647eb59e5620d0"), "ConcatResult" : "Chris MySQL MongoDB Java" }
คำอธิบาย Pipeline
$projectแรก:$reduceวนลูป Subjects รวมเป็น string " MySQL MongoDB Java" (นำหน้าด้วย space)$projectที่สอง:$concatรวม Name1 + values
วิธีง่ายกว่า (MongoDB 4.4+)
ใช้ $reduce แบบเดี่ยว:
{ $project: { ConcatResult: { $reduce: { input: "$Subjects", initialValue: "$Name1", in: { $concat: ["$$value", " ", "$$this"] } } } } }
หรือใช้ $function (MongoDB 4.4+) เขียน JavaScript custom logic