Có, để tìm kiếm mảng đối tượng, sử dụng $unwind trong aggregate() kết hợp $match để lọc.
Tạo collection với mảng đối tượng lồng nhau
> db.demo623.insertOne({
_id: 1,
details: [
{ Name: "Chris" },
{ DueDate: new ISODate("2020-01-10") },
{ CountryName: "US" }
]
});
{ "acknowledged" : true, "insertedId" : 1 }
Hiển thị document
> db.demo623.find().pretty();
Kết quả:
{
"_id" : 1,
"details" : [
{ "Name" : "Chris" },
{ "DueDate" : ISODate("2020-01-10T00:00:00Z") },
{ "CountryName" : "US" }
]
}
Truy vấn tìm kiếm với $unwind và $match
> db.demo623.aggregate([
{ $unwind: "$details" },
{ $match: { "details.Name": "Chris" } },
{ $project: { "details.Name": 1 } }
])
Kết quả:
{
"_id" : 1,
"details" : { "Name" : "Chris" }
}
Giải thích quy trình:
$unwind: "$details": Phân rã mảngdetailsthành các document riêng biệt, mỗi document chứa một phần tử của mảng$match: { "details.Name": "Chris" }: Lọc giữ lại document có trườngNamebằng "Chris"$project: Chỉ chọn trường cần thiết cho kết quả đầu ra
Cách này hiệu quả khi cần tìm kiếm sâu vào các đối tượng bên trong mảng.