Wat u in de resultaten ziet, is correct. Je aanpak is een beetje verkeerd. Als u de resultaten wilt die u verwacht, moet u deze aanpak gebruiken:
collection.aggregate([
{$match:{greetings:{$elemMatch:query}}},
{$unwind:"$greetings"},
{$match:{"greetings.hello":"world"}},
]).toArray()
Hiermee zou u de volgende uitvoer moeten krijgen:
[
{greetings:{hello:"world"}},
{greetings:{hello:"world"}},
{greetings:{"hello":"world","extra":"data"}
]
Wanneer u aggregation
gebruikt in MongoDB en een aggregatiepijplijn wilt maken die documenten oplevert die u verwacht, moet u uw query altijd met de eerste fase beginnen. En voeg dan eventueel stadia toe om de output van volgende stadia te monitoren.
De uitvoer van uw $unwind
fase zou zijn:
[{
greetings:{hello:"world"}
},
{
greetings:{hello:"world", extra:"data"}
},
{
greetings:{hello:"world"}
},
{
greetings:{aloha:"mars"}
}]
Als we nu de derde fase opnemen die je hebt gebruikt, dan zou deze overeenkomen met greetings
sleutel met een waarde {hello:"world"}
en met die exacte waarde zou het slechts twee documenten in de pijplijn vinden. U krijgt dus alleen:
{ "greetings" : { "hello" : "world" } }
{ "greetings" : { "hello" : "world" } }