sql >> Databasteknik >  >> NoSQL >> MongoDB

Inom en mongodb $match, hur man testar för field MATCHING, snarare än field EQUALING

Det du ser i resultaten är korrekt. Ditt tillvägagångssätt är lite fel. Om du vill ha de resultat du förväntar dig bör du använda detta tillvägagångssätt:

collection.aggregate([
  {$match:{greetings:{$elemMatch:query}}},
  {$unwind:"$greetings"},
  {$match:{"greetings.hello":"world"}},
]).toArray()

Med detta bör du få följande utdata:

[
  {greetings:{hello:"world"}},
  {greetings:{hello:"world"}},
  {greetings:{"hello":"world","extra":"data"}
]

När du använder aggregation i MongoDB och vill skapa en aggregeringspipeline som ger dokument du förväntar dig, bör du alltid starta din fråga med det första steget. Lägg sedan till steg för att övervaka utsignalerna från efterföljande steg.

Utdata från din $unwind skede skulle vara:

[{
  greetings:{hello:"world"}
},
{
  greetings:{hello:"world", extra:"data"}
},
{
  greetings:{hello:"world"}
},
{
  greetings:{aloha:"mars"}
}]

Om vi ​​nu inkluderar det tredje steget som du använde, så skulle det matcha för greetings nyckel som har ett värde {hello:"world"} och med det exakta värdet skulle den bara hitta två dokument i pipelinen. Så du skulle bara få:

{ "greetings" : { "hello" : "world" } }
{ "greetings" : { "hello" : "world" } }



  1. Hur man tar bort många dokument i en partitionerad samling i Azure CosmosDB med MongoDB API

  2. Replikera MongoDB över en hybrid molnmiljö

  3. Uppdatera flera underdokument utan exakt villkor på underdokumentnivå

  4. Mongoose JS findOne returnerar alltid null