สำหรับสิ่งนี้ ให้ใช้ $addFields ในการนั้น ใช้ $objectToArray เพื่อรับข้อมูลในรูปแบบของคีย์และค่า ใช้ตัวกรอง $ กับ $indexOfBytes เพื่อตรวจสอบว่ามีคีย์ใดบ้าง ข้างในนั้น
ให้เราสร้างคอลเลกชันที่มีเอกสารก่อน -
> db.demo364.insertOne( ... { ... "details" : { ... "details1.otherdetails.Name" : {"FirstName":"Chris" } ... } ... } ... ); { "acknowledged" : true, "insertedId" : ObjectId("5e57d485d0ada61456dc936d") } > db.demo364.insertOne( ... { ... "details" : { ... "details1.otherdetails.Name" : {"FirstName":"David" } ... } ... } ... ); { "acknowledged" : true, "insertedId" : ObjectId("5e57d486d0ada61456dc936e") }
แสดงเอกสารทั้งหมดจากคอลเล็กชันโดยใช้วิธี find() -
> db.demo364.find();
สิ่งนี้จะสร้างผลลัพธ์ต่อไปนี้ -
{ "_id" : ObjectId("5e57d485d0ada61456dc936d"), "details" : { "details1.otherdetails.Name" : { "FirstName" : "Chris" } } } { "_id" : ObjectId("5e57d486d0ada61456dc936e"), "details" : { "details1.otherdetails.Name" : { "FirstName" : "David" } } }
ต่อไปนี้เป็นแบบสอบถามเพื่อค้นหาระเบียนที่มีคีย์ที่มีจุด -
> db.demo364.aggregate([ ... { ... $addFields: { ... result: { ... $filter: { ... input: { $objectToArray: "$details" }, ... cond: { ... $ne: [ { $indexOfBytes: [ "$$this.k", "." ] } , -1 ] ... } ... } ... } ... } ... }, ... { ... $match: { ... $expr: { ... $ne: [ { $size: "$result" }, 0 ] ... } ... } ... }, ... { ... $project: { ... result: 0 ... } ... } ... ])
สิ่งนี้จะสร้างผลลัพธ์ต่อไปนี้ -
{ "_id" : ObjectId("5e57d485d0ada61456dc936d"), "details" : { "details1.otherdetails.Name" : { "FirstName" : "Chris" } } } { "_id" : ObjectId("5e57d486d0ada61456dc936e"), "details" : { "details1.otherdetails.Name" : { "FirstName" : "David" } } }