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

นับรายการที่ไม่ซ้ำกันในฟิลด์แบบอาร์เรย์ทั่วทั้งเอกสาร MongoDB

หากต้องการนับรายการที่ไม่ซ้ำกัน (unique items) ในฟิลด์ที่เป็นอาร์เรย์ ให้ใช้ขั้นตอน $group ร่วมกับเมธอด aggregate() มาสร้างคอลเลกชันพร้อมเอกสารตัวอย่างกันก่อน

> db.demo493.insertOne({"SubjectName":["MySQL","MongoDB","Java"]});
{ "acknowledged" : true, "insertedId" : ObjectId("5e849f97b0f3fa88e22790c4") }
> db.demo493.insertOne({"SubjectName":["C++","MongoDB","C"]});
{ "acknowledged" : true, "insertedId" : ObjectId("5e849fa4b0f3fa88e22790c5") }
> db.demo493.insertOne({"SubjectName":["MySQL","MongoDB","C"]});
{ "acknowledged" : true, "insertedId" : ObjectId("5e849fb2b0f3fa88e22790c6") }

แสดงเอกสารทั้งหมดในคอลเลกชันด้วยเมธอด find():

> db.demo493.find();

ผลลัพธ์ที่ได้:

{ "_id" : ObjectId("5e849f97b0f3fa88e22790c4"), "SubjectName" : [ "MySQL", "MongoDB", "Java" ] }
{ "_id" : ObjectId("5e849fa4b0f3fa88e22790c5"), "SubjectName" : [ "C++", "MongoDB", "C" ] }
{ "_id" : ObjectId("5e849fb2b0f3fa88e22790c6"), "SubjectName" : [ "MySQL", "MongoDB", "C" ] }

คิวรีสำหรับนับรายการที่ไม่ซ้ำกันในฟิลด์อาร์เรย์ทั่วทุกเอกสาร

> db.demo493.aggregate([
...   { $unwind: "$SubjectName" },
...   { $group: { _id: "$SubjectName", Frequency: { $sum : 1 } } }
... ]);

ผลลัพธ์จะแสดงแต่ละวิชาพร้อมจำนวนครั้งที่ปรากฏ (ความถี่):

{ "_id" : "C++", "Frequency" : 1 }
{ "_id" : "C", "Frequency" : 2 }
{ "_id" : "Java", "Frequency" : 1 }
{ "_id" : "MySQL", "Frequency" : 2 }
{ "_id" : "MongoDB", "Frequency" : 3 }

คำอธิบายขั้นตอนการทำงาน

  • $unwind: แยกอาร์เรย์ SubjectName ให้แต่ละสมาชิกกลายเป็นเอกสารแยกต่างหาก
  • $group: จัดกลุ่มตามชื่อวิชา (_id: "$SubjectName") และนับจำนวนด้วย $sum: 1

วิธีนี้เหมาะสำหรับการวิเคราะห์ข้อมูลในฟิลด์อาร์เรย์ เช่น การนับแท็ก, หมวดหมู่, หรือรายการที่ซ้ำกันในหลายเอกสาร