MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Testen Sie innerhalb eines mongodb $match auf das Feld MATCHING und nicht auf das Feld EQUALING

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" } }