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.