O que você está vendo nos resultados está correto. Sua abordagem está um pouco errada. Se você deseja os resultados esperados, use esta abordagem:
collection.aggregate([
{$match:{greetings:{$elemMatch:query}}},
{$unwind:"$greetings"},
{$match:{"greetings.hello":"world"}},
]).toArray()
Com isso, você deve obter a seguinte saída:
[
{greetings:{hello:"world"}},
{greetings:{hello:"world"}},
{greetings:{"hello":"world","extra":"data"}
]
Sempre que você estiver usando
aggregation
no MongoDB e deseja criar um pipeline de agregação que produza os documentos esperados, você deve sempre iniciar sua consulta com o primeiro estágio. E, eventualmente, adicione estágios para monitorar as saídas dos estágios subsequentes. A saída do seu
$unwind
estágio seria:[{
greetings:{hello:"world"}
},
{
greetings:{hello:"world", extra:"data"}
},
{
greetings:{hello:"world"}
},
{
greetings:{aloha:"mars"}
}]
Agora, se incluirmos o terceiro estágio que você usou, ele corresponderia a
greetings
chave que tem um valor {hello:"world"}
e com esse valor exato, encontraria apenas dois documentos no pipeline. Então você só estaria recebendo:{ "greetings" : { "hello" : "world" } }
{ "greetings" : { "hello" : "world" } }