Това, което виждате в резултатите, е правилно. Подходът ти е малко грешен. Ако искате резултатите, които очаквате, тогава трябва да използвате този подход:
collection.aggregate([
{$match:{greetings:{$elemMatch:query}}},
{$unwind:"$greetings"},
{$match:{"greetings.hello":"world"}},
]).toArray()
С това трябва да получите следния резултат:
[
{greetings:{hello:"world"}},
{greetings:{hello:"world"}},
{greetings:{"hello":"world","extra":"data"}
]
Всеки път, когато използвате aggregation
в MongoDB и искате да създадете конвейер за агрегиране, който дава документи, които очаквате, винаги трябва да започвате заявката си с първия етап. И след това евентуално добавете етапи, за да наблюдавате резултатите от следващите етапи.
Резултатът от вашия $unwind
етап ще бъде:
[{
greetings:{hello:"world"}
},
{
greetings:{hello:"world", extra:"data"}
},
{
greetings:{hello:"world"}
},
{
greetings:{aloha:"mars"}
}]
Сега, ако включим третия етап, който сте използвали, тогава той ще съответства на greetings
ключ, който има стойност {hello:"world"}
и с тази точна стойност ще намери само два документа в процес на подготовка. Така ще получите само:
{ "greetings" : { "hello" : "world" } }
{ "greetings" : { "hello" : "world" } }