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

การสร้างฟิลด์ใหม่และนับจำนวนองค์ประกอบในอาร์เรย์ซ้อนด้วย $addFields และ $size ใน MongoDB

เพิ่มฟิลด์ใหม่ที่เก็บจำนวนสมาชิกของอาร์เรย์ซ้อนด้วย $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