บทความนี้สาธิตการใช้ $in เพื่อค้นหาเอกสารที่ Array Field ListOfNames มีชื่อที่อยู่ในรายการที่กำหนด (John และ Carol) ซึ่งเป็นการ "นับ Tag" แบบง่ายๆ
สร้างข้อมูลตัวอย่าง
> db.tagCountDemo.insertOne({"ListOfNames":["John","Sam","Carol"]});
{ "acknowledged" : true, "insertedId" : ObjectId("5cd64b387924bb85b3f48944") }
> db.tagCountDemo.insertOne({"ListOfNames":["Bob","David","John"]});
{ "acknowledged" : true, "insertedId" : ObjectId("5cd64b4b7924bb85b3f48945") }
> db.tagCountDemo.insertOne({"ListOfNames":["Mike","Robert","Chris"]});
{ "acknowledged" : true, "insertedId" : ObjectId("5cd64b5d7924bb85b3f48946") }
> db.tagCountDemo.insertOne({"ListOfNames":["James","Carol","Jace"]});
{ "acknowledged" : true, "insertedId" : ObjectId("5cd64b717924bb85b3f48947") }
แสดงข้อมูลทั้งหมด
> db.tagCountDemo.find().pretty();
{
"_id" : ObjectId("5cd64b387924bb85b3f48944"),
"ListOfNames" : [ "John", "Sam", "Carol" ]
}
{
"_id" : ObjectId("5cd64b4b7924bb85b3f48945"),
"ListOfNames" : [ "Bob", "David", "John" ]
}
{
"_id" : ObjectId("5cd64b5d7924bb85b3f48946"),
"ListOfNames" : [ "Mike", "Robert", "Chris" ]
}
{
"_id" : ObjectId("5cd64b717924bb85b3f48947"),
"ListOfNames" : [ "James", "Carol", "Jace" ]
}
ค้นหาเอกสารที่มี "John" หรือ "Carol" ใน ListOfNames
> db.tagCountDemo.find({"ListOfNames":{$in:['John','Carol']}});
ผลลัพธ์ (พบ 3 Document)
{
"_id" : ObjectId("5cd64b387924bb85b3f48944"),
"ListOfNames" : [ "John", "Sam", "Carol" ]
}
{
"_id" : ObjectId("5cd64b4b7924bb85b3f48945"),
"ListOfNames" : [ "Bob", "David", "John" ]
}
{
"_id" : ObjectId("5cd64b717924bb85b3f48947"),
"ListOfNames" : [ "James", "Carol", "Jace" ]
}
นับจำนวนเอกสารที่ตรงเงื่อนไข
> db.tagCountDemo.find({"ListOfNames":{$in:['John','Carol']}}).count();
ผลลัพธ์: 3
ขยายความเป็น "Tag Count" จริง (นับความถี่แต่ละ Tag)
หากต้องการนับว่าแต่ละชื่อปรากฏกี่ครั้ง ใช้ Aggregation:
db.tagCountDemo.aggregate([
{ $unwind: "$ListOfNames" },
{ $match: { ListOfNames: { $in: ["John", "Carol"] } } },
{ $group: { _id: "$ListOfNames", count: { $sum: 1 } } },
{ $sort: { count: -1 } }
]);
{ "_id" : "John", "count" : 2 }
{ "_id" : "Carol", "count" : 2 }
สรุป
$inเหมาะสำหรับ Filter: "มีค่าใดค่าหนึ่งในรายการ"- นับจำนวน Document: ใช้
.count()หลังfind() - นับความถี่แต่ละค่า: ใช้
$unwind+$group+$sum