To, co widzisz w wynikach, jest prawidłowe. Twoje podejście jest trochę błędne. Jeśli chcesz uzyskać oczekiwane wyniki, powinieneś zastosować następujące podejście:
collection.aggregate([
{$match:{greetings:{$elemMatch:query}}},
{$unwind:"$greetings"},
{$match:{"greetings.hello":"world"}},
]).toArray()
Dzięki temu powinieneś otrzymać następujące wyjście:
[
{greetings:{hello:"world"}},
{greetings:{hello:"world"}},
{greetings:{"hello":"world","extra":"data"}
]
Zawsze, gdy używasz aggregation
w MongoDB i chcesz utworzyć potok agregacji, który dostarcza dokumenty, których oczekujesz, powinieneś zawsze zaczynać zapytanie od pierwszego etapu. A następnie w końcu dodaj etapy, aby monitorować dane wyjściowe z kolejnych etapów.
Wyjście twojego $unwind
etap byłby:
[{
greetings:{hello:"world"}
},
{
greetings:{hello:"world", extra:"data"}
},
{
greetings:{hello:"world"}
},
{
greetings:{aloha:"mars"}
}]
Teraz, jeśli uwzględnimy trzeci etap, którego użyłeś, pasowałby on do greetings
klucz, który ma wartość {hello:"world"}
a przy tej dokładnej wartości znalazłby tylko dwa dokumenty w potoku. Więc dostaniesz tylko:
{ "greetings" : { "hello" : "world" } }
{ "greetings" : { "hello" : "world" } }