Method distinct() สามารถใช้ดึงค่า Unique ของ Nested Field แบบ Deep Path ได้ เนื้อหานี้สาธิตการดึง PhoneNumber จาก details.PhoneDetails.PhoneNumber ทั้ง Collection เป็น Array
ตัวอย่างข้อมูลทดสอบ
> db.demo166.insertOne({
"details": {
"UserName": "Chris", "UserAge": 29,
"PhoneDetails": { "PhoneNumber": "98646463533" }
}
});
{ "acknowledged" : true, "insertedId" : ObjectId("5e368b159e4f06af551997cf") }
> db.demo166.insertOne({
"details": {
"UserName": "David", "UserAge": 21,
"PhoneDetails": { "PhoneNumber": "87664534654" }
}
});
{ "acknowledged" : true, "insertedId" : ObjectId("5e368b159e4f06af551997d0") }
แสดงข้อมูลทั้งหมด
> db.demo166.find();
{
"_id" : ObjectId("5e368b159e4f06af551997cf"),
"details" : {
"UserName" : "Chris", "UserAge" : 29,
"PhoneDetails" : { "PhoneNumber" : "98646463533" }
}
}
{
"_id" : ObjectId("5e368b159e4f06af551997d0"),
"details" : {
"UserName" : "David", "UserAge" : 21,
"PhoneDetails" : { "PhoneNumber" : "87664534654" }
}
}
Query distinct Phone Number
> db.demo166.distinct("details.PhoneDetails.PhoneNumber");
ผลลัพธ์
[ "98646463533", "87664534654" ]
คำอธิบาย
- Dot Notation รองรับ Deep Path:
details.PhoneDetails.PhoneNumber distinct()คืนค่า Array ของ Unique Values โดยอัตโนมัติ- หากมี Duplicate Phone Number จะคืนค่าเพียงครั้งเดียว
- สามารถเพิ่ม Filter ได้:
distinct("details.PhoneDetails.PhoneNumber", { "details.UserAge": { $gt: 25 } }) - ใช้ Index ได้หากมี Index บน Path นั้น (MongoDB รองรับ Index บน Nested Field)
- ข้อจำกัด: ผลลัพธ์ ≤ 16MB