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?
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é:
$eq
Opérateur de requête de comparaison fait correspondre un champ à une valeur .$eq
Opérateur d'agrégation de comparaison compare la valeur de deux expressions .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.
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" } );