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

Tìm kiếm khi tên khóa (key) không xác định trong MongoDB

Khi không biết trước tên trường (dynamic keys), dùng aggregation với $objectToArray chuyển object thành mảng cặp {k, v}, sau đó lọc.

Tạo collection:

> db.demo375.insertOne({"details":{"Name":"John","Age":23}});
{ "acknowledged" : true, "insertedId" : ObjectId("5e5a0ae42ae06a1609a00b06") }
> db.demo375.insertOne({"details":{"Name":"David","Age":21}});
{ "acknowledged" : true, "insertedId" : ObjectId("5e5a0ae42ae06a1609a00b07") }
> db.demo375.insertOne({"details":{"Name":"David","Age":22}});
{ "acknowledged" : true, "insertedId" : ObjectId("5e5a0ae42ae06a1609a00b08") }

Xem dữ liệu:

> db.demo375.find();
{ "_id" : ObjectId("5e5a0ae42ae06a1609a00b06"), "details" : { "Name" : "John", "Age" : 23 } }
{ "_id" : ObjectId("5e5a0ae42ae06a1609a00b07"), "details" : { "Name" : "David", "Age" : 21 } }
{ "_id" : ObjectId("5e5a0ae42ae06a1609a00b08"), "details" : { "Name" : "David", "Age" : 22 } }

Aggregation tìm tài liệu có giá trị "David" ở bất kỳ trường nào của object details:

> db.demo375.aggregate([
  { "$addFields": {
    "UnknownKeys": { "$objectToArray": "$$ROOT" }
  }},
  { "$match": { "UnknownKeys.v.Name": "David" }},
  { "$project": { "UnknownKeys": 0 }}
])

Kết quả (2 tài liệu có Name=David):

Phân tích:

  • $$ROOT: tham chiếu toàn bộ tài liệu gốc
  • $objectToArray: chuyển object thành mảng [{k, v}, ...]
  • $match trên UnknownKeys.v.Name: lọc các cặp có key="Name" và value="David"
  • $project: loại bỏ trường tạm

Cách này linh hoạt cho schema động (dynamic schema) nơi tên trường không cố định.