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

Truy vấn giá trị (không phải object) trong mảng MongoDB

Để truy vấn giá trị đơn giản trong mảng (không phải object), sử dụng positional operator ($) trong projection.

Tạo collection với mảng chuỗi

> db.demo628.insertOne({id:1, Name:["Chris","David","John"]});
> db.demo628.insertOne({id:1, Name:["Carol","Sam"]});
> db.demo628.insertOne({id:2, Name:["Mike","Sam","John"]});

Hiển thị tất cả

> db.demo628.find();

Kết quả:

{
  "_id" : ObjectId("5e9ae7ea6c954c74be91e6b6"),
  "id" : 1, "Name" : [ "Chris", "David", "John" ]
}
{
  "_id" : ObjectId("5e9ae7f26c954c74be91e6b7"),
  "id" : 1, "Name" : [ "Carol", "Sam" ]
}
{
  "_id" : ObjectId("5e9ae8056c954c74be91e6b8"),
  "id" : 2, "Name" : [ "Mike", "Sam", "John" ]
}

Truy vấn tìm "John" và chỉ trả về phần tử khớp

> db.demo628.find({ "Name": "John" }, { "id": 1, "Name.$": 1 });

Kết quả (chỉ giữ "John" trong mảng Name):

{
  "_id" : ObjectId("5e9ae7ea6c954c74be91e6b6"),
  "id" : 1, "Name" : [ "John" ]
}
{
  "_id" : ObjectId("5e9ae8056c954c74be91e6b8"),
  "id" : 2, "Name" : [ "John" ]
}

Giải thích:

  • Điều kiện { "Name": "John" } tìm document có "John" trong mảng
  • Projection { "Name.$": 1 } dùng positional operator $ để chỉ trả về **phần tử đầu tiên** khớp điều kiện trong mảng
  • Document thứ 2 (Carol, Sam) không có "John" → không xuất hiện trong kết quả

Lưu ý: Positional operator $ chỉ trả về **một** phần tử khớp đầu tiên. Nếu cần tất cả phần tử khớp, dùng $elemMatch trong projection hoặc $filter trong aggregate (MongoDB 3.2+).