Det du ser i resultaterne er korrekt. Din tilgang er lidt forkert. Hvis du vil have de resultater, du forventer, skal du bruge denne tilgang:
collection.aggregate([
{$match:{greetings:{$elemMatch:query}}},
{$unwind:"$greetings"},
{$match:{"greetings.hello":"world"}},
]).toArray()
Med dette skulle du få følgende output:
[
{greetings:{hello:"world"}},
{greetings:{hello:"world"}},
{greetings:{"hello":"world","extra":"data"}
]
Hver gang du bruger aggregation
i MongoDB og ønsker at skabe en aggregeringspipeline, der giver de dokumenter, du forventer, bør du altid starte din forespørgsel med den første fase. Og tilføje til sidst trin for at overvåge output fra efterfølgende trin.
Outputtet af din $unwind
fase ville være:
[{
greetings:{hello:"world"}
},
{
greetings:{hello:"world", extra:"data"}
},
{
greetings:{hello:"world"}
},
{
greetings:{aloha:"mars"}
}]
Hvis vi nu inkluderer det tredje trin, som du brugte, så ville det matche for greetings
nøgle, der har en værdi {hello:"world"}
og med den nøjagtige værdi ville den kun finde to dokumenter i pipelinen. Så du ville kun få:
{ "greetings" : { "hello" : "world" } }
{ "greetings" : { "hello" : "world" } }