To, co vidíte ve výsledcích, je správné. Tvůj přístup je trochu špatný. Pokud chcete výsledky, které očekáváte, měli byste použít tento přístup:
collection.aggregate([
{$match:{greetings:{$elemMatch:query}}},
{$unwind:"$greetings"},
{$match:{"greetings.hello":"world"}},
]).toArray()
Díky tomu byste měli získat následující výstup:
[
{greetings:{hello:"world"}},
{greetings:{hello:"world"}},
{greetings:{"hello":"world","extra":"data"}
]
Kdykoli používáte aggregation
v MongoDB a chcete vytvořit agregační kanál, který poskytuje dokumenty, které očekáváte, měli byste vždy začít svůj dotaz první fází. A pak případně přidat fáze pro sledování výstupů z následujících fází.
Výstup vašeho $unwind
fáze by byla:
[{
greetings:{hello:"world"}
},
{
greetings:{hello:"world", extra:"data"}
},
{
greetings:{hello:"world"}
},
{
greetings:{aloha:"mars"}
}]
Pokud nyní zahrneme třetí fázi, kterou jste použili, pak by odpovídala greetings
klíč, který má hodnotu {hello:"world"}
a s touto přesnou hodnotou by našel pouze dva dokumenty v procesu. Takže byste dostali pouze:
{ "greetings" : { "hello" : "world" } }
{ "greetings" : { "hello" : "world" } }