Was Sie in den Ergebnissen sehen, ist richtig. Dein Ansatz ist etwas falsch. Wenn Sie die erwarteten Ergebnisse erzielen möchten, sollten Sie diesen Ansatz verwenden:
collection.aggregate([
{$match:{greetings:{$elemMatch:query}}},
{$unwind:"$greetings"},
{$match:{"greetings.hello":"world"}},
]).toArray()
Damit sollten Sie die folgende Ausgabe erhalten:
[
{greetings:{hello:"world"}},
{greetings:{hello:"world"}},
{greetings:{"hello":"world","extra":"data"}
]
Wann immer Sie aggregation
verwenden in MongoDB und möchten eine Aggregationspipeline erstellen, die die erwarteten Dokumente liefert, sollten Sie Ihre Abfrage immer mit der ersten Stufe beginnen. Und fügen Sie dann schließlich Stufen hinzu, um die Ausgaben nachfolgender Stufen zu überwachen.
Die Ausgabe von $unwind
Stufe wäre:
[{
greetings:{hello:"world"}
},
{
greetings:{hello:"world", extra:"data"}
},
{
greetings:{hello:"world"}
},
{
greetings:{aloha:"mars"}
}]
Wenn wir nun die von Ihnen verwendete dritte Stufe einbeziehen, würde sie für greetings
übereinstimmen Schlüssel mit dem Wert {hello:"world"}
und mit genau diesem Wert würde es nur zwei Dokumente in der Pipeline finden. Sie würden also nur Folgendes erhalten:
{ "greetings" : { "hello" : "world" } }
{ "greetings" : { "hello" : "world" } }