Трябва да обработите $unwind
когато работите с масиви и трябва да направите това три пъти:
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 }
}}
])
В идеалния случай искате да филтрирате входа си. Евентуално направете това с $match преди и след $unwind се обработва и се използва $regex за съпоставяне на документи, където данните започват с "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 }
}}
])
Обърнете внимание, че във всички случаи записите с префикс "dollar $" са "променливите", отнасящи се до свойствата на документа. Това са "стойности", за да използвате вход от дясната страна. „Клавишите“ от лявата страна трябва да бъдат посочени като обикновен низов ключ. Не може да се използва променлива за име на ключ.