Để lọc bản ghi từ mảng sub-document, hãy sử dụng $unwind kết hợp $match với regex. Để lọc id bắt đầu bằng "234", dùng regex /^234/.
Tạo collection với mảng details chứa các object có id dạng chuỗi:
> db.demo556.insertOne(
... {
... _id:101,
... details:[
... { id:"234336", Name:"Chris" },
... { id:"123456", Name:"Bob" },
... { id:"234987", Name:"Carol" },
... { id:"989768", Name:"David" },
... { id:"234888", Name:"Sam" },
... { id:"847656", Name:"John" }
... ]
... }
... );
{ "acknowledged" : true, "insertedId" : 101 }
Hiển thị tài liệu gốc:
> db.demo556.find();
Kết quả:
{ "_id" : 101, "details" : [ { "id" : "234336", "Name" : "Chris" }, { "id" : "123456", "Name" : "Bob" }, { "id" : "234987", "Name" : "Carol" }, { "id" : "989768", "Name" : "David" }, { "id" : "234888", "Name" : "Sam" }, { "id" : "847656", "Name" : "John" } ] }
Pipeline aggregate: match _id=101, unwind mảng details, match regex id bắt đầu 234, group lại đẩy vào mảng Detail:
> db.demo556.aggregate({
... $match: { "_id": 101 }
... }, {
... $unwind: "$details"
... }, {
... $match: {
... "details.id": { $regex: /^234/ }
... }
... }, {
... $group: {
... _id: "$_id",
... "Detail": { $push: "$details" }
... }
... }).pretty();
Kết quả (3 bản ghi id bắt đầu 234):
{
"_id" : 101,
"Detail" : [
{ "id" : "234336", "Name" : "Chris" },
{ "id" : "234987", "Name" : "Carol" },
{ "id" : "234888", "Name" : "Sam" }
]
}