เพิ่มฟิลด์ใหม่ที่เก็บจำนวนสมาชิกของอาร์เรย์ซ้อนด้วย $addFields และ $map
ใช้ $addFields ร่วมกับ $map และ $size เพื่อสร้างฟิลด์ใหม่ที่เก็บจำนวน (Count) ของอาร์เรย์ซ้อนในแต่ละออบเจกต์
ตัวอย่างข้อมูลทดสอบ
> db.demo429.insertOne({
"_id": 101,
"Value": 3,
"details": [
{ "Age": 29, "Value": 3, "details1": [1, 2, 3] },
{ "Age": 31, "Value": 4, "details1": [354] }
]
});
แสดงข้อมูลก่อน
> db.demo429.find();
ผลลัพธ์:
{ "_id": 101, "Value": 3, "details": [{ "Age": 29, "Value": 3, "details1": [1, 2, 3] }, { "Age": 31, "Value": 4, "details1": [354] }] }
คำสั่ง Aggregation เพิ่มฟิลด์ NumberOfDetails1
> db.demo429.aggregate([
{
$addFields: {
details: {
$map: {
input: "$details",
as: "d",
in: {
Age: "$$d.Age",
NumberOfDetails1: { $size: "$$d.details1" }
}
}
}
}
}
]);
ผลลัพธ์ที่ได้
{ "_id": 101, "Value": 3, "details": [{ "Age": 29, "NumberOfDetails1": 3 }, { "Age": 31, "NumberOfDetails1": 1 }] }
คำอธิบาย
- $addFields: เพิ่ม/แก้ไขฟิลด์ในเอกสาร (รักษาฟิลด์เดิมไว้)
- $map: วนลูปผ่านอาร์เรย์ details สร้างออบเจกต์ใหม่แต่ละตัว
- input: "$details", as: "d": ตัวแปร d แทนแต่ละออบเจกต์ใน details
- in: { Age: "$$d.Age", NumberOfDetails1: { $size: "$$d.details1" } }: สร้างออบเจกต์ใหม่ เก็บ Age เดิม และเพิ่ม NumberOfDetails1 = ขนาดของ details1
- $size: คืนจำนวนองค์ประกอบในอาร์เรย์
การใช้งาน $size
- ใช้ได้ใน $project, $addFields, $match (ผ่าน $expr)
- ไม่ใช้ได้ใน Query Condition โดยตรง (ต้องใช้ $expr: { $eq: [{ $size: "$array" }, 3] })
- คืนค่า null ถ้าฟิลด์ไม่ใช่อาร์เรย์หรือไม่มีอยู่
ประโยชน์
คำนวณขนาดอาร์เรย์ซ้อนได้ใน Query เดียว ไม่ต้องดึงข้อมูลมานับฝั่ง Application