Dot Notation ใน MongoDB ใช้ไม่ได้แค่ Filter Condition แต่ยังใช้ใน Projection (Field Selection) เพื่อเลือกฟิลด์ย่อยภายใน Nested Document/Array ได้ เนื้อหานี้สาธิตการ Query เอกสารที่มี details.Subject = "MongoDB" และ Project เฉพาะ details.Subject เท่านั้น
ตัวอย่างข้อมูลทดสอบ
> db.demo302.insertOne({"Id":101,"details":[{"Name":"Chris","Age":21,"Subject":"MySQL"}]});
{ "acknowledged" : true, "insertedId" : ObjectId("5e4d746f5d93261e4bc9ea52") }
> db.demo302.insertOne({"Id":102,"details":[{"Name":"Bob","Age":23,"Subject":"MongoDB"}]});
{ "acknowledged" : true, "insertedId" : ObjectId("5e4d74815d93261e4bc9ea53") }
> db.demo302.insertOne({"Id":103,"details":[{"Name":"David","Age":20,"Subject":"Java"}]});
{ "acknowledged" : true, "insertedId" : ObjectId("5e4d74955d93261e4bc9ea54") }
แสดงข้อมูลทั้งหมด
> db.demo302.find();
{
"_id" : ObjectId("5e4d746f5d93261e4bc9ea52"),
"Id" : 101,
"details" : [ { "Name" : "Chris", "Age" : 21, "Subject" : "MySQL" } ]
}
{
"_id" : ObjectId("5e4d74815d93261e4bc9ea53"),
"Id" : 102,
"details" : [ { "Name" : "Bob", "Age" : 23, "Subject" : "MongoDB" } ]
}
{
"_id" : ObjectId("5e4d74955d93261e4bc9ea54"),
"Id" : 103,
"details" : [ { "Name" : "David", "Age" : 20, "Subject" : "Java" } ]
}
Query Field Selection ด้วย Dot Notation
> db.demo302.find(
{"details.Subject":"MongoDB"},
{"details.Name":0, "details.Age":0, "_id":0, "Id":0}
);
ผลลัพธ์
{ "details" : [ { "Subject" : "MongoDB" } ] }
คำอธิบาย
- Filter:
{"details.Subject":"MongoDB"}- ค้นหาใน Array details ที่ Element ใด Element หนึ่งมี Subject = MongoDB - Projection: ใช้ Exclusion Mode (
0) ยกเว้นฟิลด์ที่ไม่ต้องการ details.Name:0, details.Age:0- ยกเว้นฟิลด์ย่อยใน Object ภายใน Array- ผลลัพธ์คงโครงสร้าง Array
detailsไว้ แต่มีเฉพาะ Subject - Note: ไม่สามารถ Project เพื่อ "Filter Element ใน Array" ได้ (ต้องใช้ $elemMatch หรือ Aggregation $filter)