Quello che vedi nei risultati è corretto. Il tuo approccio è un po' sbagliato. Se vuoi i risultati che ti aspetti, dovresti usare questo approccio:
collection.aggregate([
{$match:{greetings:{$elemMatch:query}}},
{$unwind:"$greetings"},
{$match:{"greetings.hello":"world"}},
]).toArray()
Con questo, dovresti ottenere il seguente output:
[
{greetings:{hello:"world"}},
{greetings:{hello:"world"}},
{greetings:{"hello":"world","extra":"data"}
]
Ogni volta che utilizzi aggregation
in MongoDB e vuoi creare una pipeline di aggregazione che produca i documenti che ti aspetti, dovresti sempre iniziare la tua query con la prima fase. E poi eventualmente aggiungere fasi per monitorare gli output delle fasi successive.
L'output del tuo $unwind
la fase sarebbe:
[{
greetings:{hello:"world"}
},
{
greetings:{hello:"world", extra:"data"}
},
{
greetings:{hello:"world"}
},
{
greetings:{aloha:"mars"}
}]
Ora, se includiamo la terza fase che hai utilizzato, corrisponderebbe a greetings
chiave che ha un valore {hello:"world"}
e con quel valore esatto, troverebbe solo due documenti in cantiere. Quindi otterresti solo:
{ "greetings" : { "hello" : "world" } }
{ "greetings" : { "hello" : "world" } }