Đến bữa tiệc hơi muộn, nhưng hy vọng sẽ giúp ích cho những người đang tìm kiếm giải pháp. Tôi đã tìm ra cách để thực hiện việc này bằng cách sử dụng khung tổng hợp và kết hợp $ project và $ thư giãn với $ match bằng cách xâu chuỗi chúng lại với nhau. Tôi đã thực hiện nó bằng PHP nhưng bạn nên hiểu ý chính:
$ops = array(
array('$match' => array(
'collectionColumn' => 'value',
)
),
array('$project' => array(
'collection.subcollection' => 1
)
),
array('$unwind' => '$subCollection'),
array('$match' => array(
subCollection.subColumn => 'subColumnValue'
)
)
);
Đối sánh đầu tiên và dự án chỉ được sử dụng để lọc ra để làm cho nó nhanh hơn, sau đó thư giãn trên bộ sưu tập con sẽ tách ra từng mục của bộ sưu tập con theo từng mục mà sau đó có thể được lọc bằng cách sử dụng kết quả phù hợp cuối cùng.
Hy vọng điều đó sẽ hữu ích.
CẬP NHẬT (từ Ryan Wheale):
Sau đó, bạn có thể $group
dữ liệu trở lại cấu trúc ban đầu của nó. Nó giống như có một $elemMatch
trả về nhiều tài liệu con:
array('$group' => array(
'_id' => '$_id',
'subcollection' => array(
'$push' => '$subcollection'
)
)
);
Tôi đã dịch cái này từ Node sang PHP, vì vậy tôi chưa thử nghiệm bằng PHP. Nếu ai muốn có phiên bản Node, hãy để lại bình luận bên dưới và tôi sẽ bắt buộc.