Det du ser i resultaten är korrekt. Ditt tillvägagångssätt är lite fel. Om du vill ha de resultat du förväntar dig bör du använda detta tillvägagångssätt:
collection.aggregate([
{$match:{greetings:{$elemMatch:query}}},
{$unwind:"$greetings"},
{$match:{"greetings.hello":"world"}},
]).toArray()
Med detta bör du få följande utdata:
[
{greetings:{hello:"world"}},
{greetings:{hello:"world"}},
{greetings:{"hello":"world","extra":"data"}
]
När du använder aggregation
i MongoDB och vill skapa en aggregeringspipeline som ger dokument du förväntar dig, bör du alltid starta din fråga med det första steget. Lägg sedan till steg för att övervaka utsignalerna från efterföljande steg.
Utdata från din $unwind
skede skulle vara:
[{
greetings:{hello:"world"}
},
{
greetings:{hello:"world", extra:"data"}
},
{
greetings:{hello:"world"}
},
{
greetings:{aloha:"mars"}
}]
Om vi nu inkluderar det tredje steget som du använde, så skulle det matcha för greetings
nyckel som har ett värde {hello:"world"}
och med det exakta värdet skulle den bara hitta två dokument i pipelinen. Så du skulle bara få:
{ "greetings" : { "hello" : "world" } }
{ "greetings" : { "hello" : "world" } }