MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Dans un mongodb $match, comment tester le champ MATCHING , plutôt que le champ EQUALING

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