Lo que estás viendo en los resultados es correcto. Su enfoque es un poco equivocado. Si desea obtener los resultados que espera, debe utilizar este enfoque:
collection.aggregate([
{$match:{greetings:{$elemMatch:query}}},
{$unwind:"$greetings"},
{$match:{"greetings.hello":"world"}},
]).toArray()
Con esto, debería obtener el siguiente resultado:
[
{greetings:{hello:"world"}},
{greetings:{hello:"world"}},
{greetings:{"hello":"world","extra":"data"}
]
Siempre que esté usando aggregation
en MongoDB y desea crear una canalización de agregación que produzca los documentos que espera, siempre debe comenzar su consulta con la primera etapa. Y luego eventualmente agregue etapas para monitorear los resultados de las etapas subsiguientes.
La salida de tu $unwind
etapa seria:
[{
greetings:{hello:"world"}
},
{
greetings:{hello:"world", extra:"data"}
},
{
greetings:{hello:"world"}
},
{
greetings:{aloha:"mars"}
}]
Ahora, si incluimos la tercera etapa que usaste, entonces coincidiría con greetings
clave que tiene un valor {hello:"world"}
y con ese valor exacto, encontraría solo dos documentos en proceso. Así que solo obtendrías:
{ "greetings" : { "hello" : "world" } }
{ "greetings" : { "hello" : "world" } }