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

การค้นหาข้อมูลใน Subdocument ด้วย Dot Notation ใน MongoDB

MongoDB รองรับการ query เข้าไปใน subdocument (object ซ้อน object) ได้โดยใช้ Dot Notation (เครื่องหมายจุด) ซึ่งทำให้เข้าถึง field ลึกได้ง่าย

สร้างคอลเลกชันและข้อมูลตัวอย่าง

> db.demo81.insertOne({"StudentDetails":[{"StudentName":"Carol","StudentSubject":"Java"},{"StudentName":"David","StudentSubject":"MongoDB"}]});
{ "acknowledged" : true, "insertedId" : ObjectId("5e2bf6ec71bf0181ecc4229d") }
> db.demo81.insertOne({"StudentDetails":[{"StudentName":"Mike","StudentSubject":"Python"},{"StudentName":"David","StudentSubject":"C"}]});
{ "acknowledged" : true, "insertedId" : ObjectId("5e2bf70471bf0181ecc4229e") }
> db.demo81.insertOne({"StudentDetails":[{"StudentName":"Jace","StudentSubject":"C++"},{"StudentName":"John","StudentSubject":"MySQL"}]});
{ "acknowledged" : true, "insertedId" : ObjectId("5e2bf72071bf0181ecc4229f") }

แสดงข้อมูลทั้งหมด

> db.demo81.find();

ผลลัพธ์:

{ "_id" : ObjectId("5e2bf6ec71bf0181ecc4229d"), "StudentDetails" : [
  { "StudentName" : "Carol", "StudentSubject" : "Java" },
  { "StudentName" : "David", "StudentSubject" : "MongoDB" }
]}
{ "_id" : ObjectId("5e2bf70471bf0181ecc4229e"), "StudentDetails" : [
  { "StudentName" : "Mike", "StudentSubject" : "Python" },
  { "StudentName" : "David", "StudentSubject" : "C" }
]}
{ "_id" : ObjectId("5e2bf72071bf0181ecc4229f"), "StudentDetails" : [
  { "StudentName" : "Jace", "StudentSubject" : "C++" },
  { "StudentName" : "John", "StudentSubject" : "MySQL" }
]}

Query ค้นหา Subdocument ด้วย Dot Notation

> db.demo81.find({"StudentDetails.StudentSubject":"MongoDB"});

ผลลัพธ์

{ "_id" : ObjectId("5e2bf6ec71bf0181ecc4229d"), "StudentDetails" : [
  { "StudentName" : "Carol", "StudentSubject" : "Java" },
  { "StudentName" : "David", "StudentSubject" : "MongoDB" }
]}

คำอธิบาย:

  • StudentDetails.StudentSubject: MongoDB จะค้นหาใน ทุก element ของ array StudentDetails ว่ามี field StudentSubject เท่ากับ "MongoDB" หรือไม่
  • คืนค่าเอกสารทั้งหมดที่มี element ตรงเงื่อนไข (ไม่ใช่แค่ element ที่ตรง)

เทคนิคเพิ่มเติม

หากต้องการคืนค่าเฉพาะ element ที่ตรงเงื่อนไข ให้ใช้ $elemMatch ใน projection:

db.demo81.find(
  {"StudentDetails.StudentSubject": "MongoDB"},
  {"StudentDetails": {$elemMatch: {"StudentSubject": "MongoDB"}}}
)

สรุป: Dot notation เป็นวิธีง่ายและมีประสิทธิภาพสำหรับ query nested fields ทั้งใน array และ object