Ce que vous voyez dans les résultats est correct. Votre approche est un peu fausse. Si vous souhaitez obtenir les résultats escomptés, vous devez utiliser cette approche :
collection.aggregate([
{$match:{greetings:{$elemMatch:query}}},
{$unwind:"$greetings"},
{$match:{"greetings.hello":"world"}},
]).toArray()
Avec cela, vous devriez obtenir la sortie suivante :
[
{greetings:{hello:"world"}},
{greetings:{hello:"world"}},
{greetings:{"hello":"world","extra":"data"}
]
Chaque fois que vous utilisez l'aggregation
dans MongoDB et que vous souhaitez créer un pipeline d'agrégation qui génère les documents que vous attendez, vous devez toujours commencer votre requête par la première étape. Et puis ajoutez éventuellement des étapes pour surveiller les sorties des étapes suivantes.
La sortie de votre $unwind
l'étape serait :
[{
greetings:{hello:"world"}
},
{
greetings:{hello:"world", extra:"data"}
},
{
greetings:{hello:"world"}
},
{
greetings:{aloha:"mars"}
}]
Maintenant, si nous incluons la troisième étape que vous avez utilisée, elle correspondrait à greetings
clé qui a une valeur {hello:"world"}
et avec cette valeur exacte, il ne trouverait que deux documents dans le pipeline. Ainsi, vous n'obtiendrez que :
{ "greetings" : { "hello" : "world" } }
{ "greetings" : { "hello" : "world" } }