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

Chọn subdocument cụ thể trong MongoDB

Để chỉ lấy một subdocument (phần tử mảng) khớp với điều kiện, dùng projection với positional operator $.

Tạo collection:

> db.demo37.insertOne({"Details":[{"Name":"Chris","Age":21},{"Name":"David","Age":23}]});
{ "acknowledged" : true, "insertedId" : ObjectId("5e176635cfb11e5c34d898d7") }
> db.demo37.insertOne({"Details":[{"Name":"Sam","Age":23},{"Name":"Robert","Age":25}]});
{ "acknowledged" : true, "insertedId" : ObjectId("5e17664acfb11e5c34d898d8") }

Xem dữ liệu:

> db.demo37.find();
{ "_id" : ObjectId("5e176635cfb11e5c34d898d7"), "Details" : [ { "Name" : "Chris", "Age" : 21 }, { "Name" : "David", "Age" : 23 } ] }
{ "_id" : ObjectId("5e17664acfb11e5c34d898d8"), "Details" : [ { "Name" : "Sam", "Age" : 23 }, { "Name" : "Robert", "Age" : 25 } ] }

Truy vấn chọn subdocument có Name="Sam":

> db.demo37.find({'Details.Name' : 'Sam'},{_id: 0, 'Details.$.Name': 1});

Kết quả (chỉ subdocument khớp):

Giải thích:

  • Query {'Details.Name' : 'Sam'}: tìm tài liệu có phần tử mảng Details.Name = "Sam"
  • Projection {_id: 0, 'Details.$.Name': 1}: $ đại diện cho phần tử đầu tiên khớp, chỉ lấy trường Name

Lưu ý: Chỉ trả về một phần tử khớp đầu tiên. Để lấy nhiều phần tử khớp, dùng aggregation với $filter.