MongoDB cho phép khóa (field name) chứa dấu chấm, nhưng truy vấn trực tiếp sẽ bị hiểu nhầm là dot notation. Cần dùng aggregation với $objectToArray và $filter để phát hiện các khóa chứa dấu chấm.
Tạo collection với khóa có dấu chấm:
> 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") }
Xem dữ liệu:
> db.demo364.find();
{ "_id" : ObjectId("5e57d485d0ada61456dc936d"), "details" : { "details1.otherdetails.Name" : { "FirstName" : "Chris" } } }
{ "_id" : ObjectId("5e57d486d0ada61456dc936e"), "details" : { "details1.otherdetails.Name" : { "FirstName" : "David" } } }
Aggregation để tìm tài liệu có khóa chứa dấu chấm:
> db.demo364.aggregate([
{ $addFields: {
result: {
$filter: {
input: { $objectToArray: "$details" },
cond: {
$ne: [ { $indexOfBytes: [ "$$this.k", "." ] } , -1 ]
}
}
}
}},
{ $match: {
$expr: { $ne: [ { $size: "$result" }, 0 ] }
}},
{ $project: { result: 0 }}
])
Kết quả trả về các tài liệu có khóa chứa dấu chấm.
Giải thích:
$objectToArray: Chuyển object thành mảng cặp {k, v}$indexOfBytes: Tìm vị trí dấu chấm trong khóa (k)$filter: Lọc giữ lại các cặp khóa có chứa dấu chấm$matchvới$expr: Giữ tài liệu có mảng kết quả không rỗng