Bạn cần xử lý $unwind
khi làm việc với mảng và bạn cần thực hiện điều này ba lần:
db.collection.aggregate([
// Un-wind the array's to access filtering
{ "$unwind": "$studies" },
{ "$unwind": "$studies.samples" },
{ "$unwind": "$studies.samples.formdata" },
// Group results to obtain the matched count per key
{ "$group": {
"_id": "$studies.samples.formdata.GT",
"count": { "$sum": 1 }
}}
])
Lý tưởng nhất là bạn muốn lọc đầu vào của mình. Có thể thực hiện việc này với $ đối sánh cả trước và sau khi $ unwind được xử lý và sử dụng $ regex để khớp với các tài liệu trong đó dữ liệu tại điểm bắt đầu bằng "1".
db.collection.aggregate([
// Match first to exclude documents where this is not present in any array member
{ "$match": { "studies.samples.formdata.GT": /^1/ } },
// Un-wind the array's to access filtering
{ "$unwind": "$studies" },
{ "$unwind": "$studies.samples" },
{ "$unwind": "$studies.samples.formdata" },
// Match to filter
{ "$match": { "studies.samples.formdata.GT": /^1/ } },
// Group results to obtain the matched count per key
{ "$group": {
"_id": {
"_id": "$_id",
"key": "$studies.samples.formdata.GT"
},
"count": { "$sum": 1 }
}}
])
Lưu ý rằng trong mọi trường hợp, các mục có tiền tố "đô la $" là các "biến" tham chiếu đến các thuộc tính của tài liệu. Đây là những "giá trị" để sử dụng đầu vào ở phía bên phải. Các "phím" bên trái phải được chỉ định là một khóa chuỗi thuần túy. Không có biến nào có thể được sử dụng để đặt tên cho khóa.