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

Tìm kiếm đệ quy (recursive search) trong MongoDB với find() và dot notation

Vấn đề

Tìm document chứa giá trị cụ thể bên trong mảng đối tượng lồng nhau (nested array of objects) trong MongoDB.

Giải pháp: Dot Notation (ký hiệu chấm)

MongoDB cho phép truy cập trường trong mảng đối tượng bằng dot notation: "tenMang.tenTruong". Toán tử find() tự động "đệ quy" vào mảng để so khớp.

Ví dụ minh họa

1. Tạo collection với mảng đối tượng lồng nhau

> db.findOperationDemo.insertOne({
  "ClientDetails": [
    {"ClientId":101,"ClientName":"Chris"},
    {"ClientId":102,"ClientName":"Robert"}
  ]
});
> db.findOperationDemo.insertOne({
  "ClientDetails": [
    {"ClientId":110,"ClientName":"David"},
    {"ClientId":112,"ClientName":"Mike"}
  ]
});

2. Xem cấu trúc dữ liệu

> db.findOperationDemo.find().pretty();

Mỗi document có trường ClientDetails là mảng các object {ClientId, ClientName}.

3. Tìm document có ClientId = 110 bên trong mảng

> db.findOperationDemo.find({"ClientDetails.ClientId": 110});

4. Kết quả

{ "_id" : ObjectId("5cd9a12fb50a6c6dd317ad9a"),
  "ClientDetails" : [
    {"ClientId" : 110, "ClientName" : "David"},
    {"ClientId" : 112, "ClientName" : "Mike"}
  ]
}

Trả về cả document chứa phần tử khớp (không chỉ phần tử khớp).

Mở rộng

  • Kết hợp nhiều điều kiện: {"ClientDetails.ClientId": 110, "ClientDetails.ClientName": "David"} (AND logic trên cùng một phần tử mảng - cần $elemMatch cho chính xác).
  • Dùng $elemMatch khi cần khớp nhiều trường trên cùng một phần tử mảng: {ClientDetails: {$elemMatch: {ClientId: 110, ClientName: "David"}}}.
  • Projection chỉ lấy phần tử khớp: {$elemMatch: ...} trong projection.