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

La requête renvoie plus de résultats que prévu

Ce comportement est attendu et expliqué dans la documentation mongo ici .

Mongo semble être prêt à jouer au "satisfait", en donnant des résultats lorsqu'une combinaison d'éléments de tableau correspond à toutes les conditions indépendamment.

Dans notre exemple, 5 correspond à la condition $lt:20 et 25 correspond à la condition $gt:10. Donc, c'est un match.

Les deux éléments suivants renverront le résultat [5,25] :

db.collection.find({ x: {$gt: 10, $lt: 20} })

db.collection.find({ $and : [{x: {$gt: 10}},{x:{ $lt: 20}} ] })

S'il s'agit d'un comportement attendu de l'utilisateur, les opinions peuvent varier. Mais c'est certainement documenté, et on devrait s'y attendre.

Modifier , pour la modification sadique mais hautement éducative de Neil à la réponse originale, demandant une solution :

Utilisation de $elemMatch peut faire des comparaisons d'éléments "plus strictes" pour les tableaux uniquement .

db.collection.find({ x: { $elemMatch:{ $gt:10, $lt:20  } } })

Remarque  :cela correspondra à la fois à x :[11,12] et x :[11,25]

Je crois que lorsqu'une requête comme celle-ci est nécessaire, une combinaison sur deux requêtes est nécessaire, et les résultats combinés. Ci-dessous se trouve une requête qui renvoie des résultats corrects pour les documents avec x n'étant pas un tableau :

db.collection.find( { $where : "!Array.isArray(this.x)", x: {$gt: 10, $lt: 20} } )

Mais la meilleure approche dans ce cas est de changer le type de x en toujours être un tableau, même s'il ne contient qu'un seul élément. Ensuite, seule la requête $elemMatch est requise pour obtenir des résultats corrects, avec le comportement attendu.