Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MongoDB

Tìm tài liệu có khóa chứa dấu chấm trong MongoDB

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
  • $match với $expr: Giữ tài liệu có mảng kết quả không rỗng