web-dev-qa-db-fra.com

MongoDB: interrogation de documents avec deux champs égaux, $ match et $ eq

Quelle est la meilleure façon de renvoyer tous les documents d'une collection si je veux document.a == document.b?

J'ai essayé

db.collection.aggregate([ { $match: { $eq: [ '$a', '$b' ] } }])

Mais il retourne sans erreur ni résultat, car je suppose qu'il correspond littéralement aux chaînes "$ a" et "$ b". Existe-t-il une manière différente de spécifier qu'il s'agit de champs?

db.collection.aggregate([    { $project: { 
    eq: { $cond: [ { $eq: [ '$a', '$b' ] }, 1, 0 ] } 
} },
{ $match: { eq: 1 } }])

Ce qui précède fonctionne, mais nécessite l'étape supplémentaire consistant à interroger à nouveau avec les documents trouvés ou à projeter tous les champs possibles.

Existe-t-il un meilleur moyen de répondre à cette requête?

17
Peter Sampson

Fondamentalement, vous essayez d'effectuer une auto-jointure. Une opération non prise en charge par MongoDB.

Concernant l'opérateur $eq, Comme vous l'avez deviné:

Je ne connais pas d'autre moyen d'effectuer ce dont vous avez besoin que d'utiliser une étape supplémentaire $project Comme vous l'avez suggéré.

Veuillez noter que ce n'est pas significativement plus cher car, de toute façon, votre requête ne peut utiliser aucun index et MongoDB fera une analyse complète.

4
Sylvain Leroux

Si j'ai bien compris votre question, vous voulez les documents qui ont les mêmes valeurs dans les champs 1 et 2.

Pour cet essai

db.coll.find({$where: function() { return this.field1 == this.field2 } } );

ou plus compact

db.coll.find({ $where : "this.field1 == this.field2" } );
10
Shivangi Gupta