tengo una consulta a continuación. Quiero obtener elementos entre 4 y 6, así que solo a: 1 debe coincidir porque tiene el valor 5 en b.
> db.test.find({ b : { $gt : 4 }, b: {$lt : 6}});
{ "_id" : ObjectId("4d54cff54364000000004331"), "a" : 1, "b" : [ 2, 3, 4, 5 ] }
{ "_id" : ObjectId("4d54d0074364000000004332"), "a" : 2, "b" : [ 2, 4, 6, 8 ] }
>
¿Alguien puede decir por qué a: 2 corresponde a esta consulta? Realmente no puedo ver por qué se devuelve.
También probé lo que se especifica en el tutorial, pero no parece id para trabajar:
> db.test.find({ b : { $gt : 4, $lt : 6}});
{ "_id" : ObjectId("4d54cff54364000000004331"), "a" : 1, "b" : [ 2, 3, 4, 5 ] }
{ "_id" : ObjectId("4d54d0074364000000004332"), "a" : 2, "b" : [ 2, 4, 6, 8 ] }
>
Y éste para evitar cualquier confusión con respecto GT/GTE
> db.test.find({b: {$gt: 4.5, $lt: 5.5}});
{ "_id" : ObjectId("4d54cff54364000000004331"), "a" : 1, "b" : [ 2, 3, 4, 5 ] }
{ "_id" : ObjectId("4d54d0074364000000004332"), "a" : 2, "b" : [ 2, 4, 6, 8 ] }
>
sólo: 1 debe ser devuelto
Como se sugirió, le di $ elemMatch una oportunidad pero no parecen funcionar bien (ObjectID son diferentes porque estoy en un equipo diferente) fueron devueltos
> db.test.find();
{ "_id" : ObjectId("4d5a24a5e82e00000000433f"), "a" : 1, "b" : [ 2, 3, 4, 5 ] }
{ "_id" : ObjectId("4d5a24bbe82e000000004340"), "a" : 2, "b" : [ 2, 4, 6, 8 ] }
> db.test.find({b: {$elemMatch: {$gt : 4, $lt: 6 }}});
>
Ningún documento.
En realidad, deben ser devueltos ambos documentos, la pregunta significa "dame todos los documentos en los que 'B' tiene un valor que oscila entre 4 y 6", y esto se cumple por ambos documentos. ¿Podría explicar con más detalle qué es lo que quiere consultar? ¿Por qué debería encontrarse el primer documento pero no el segundo? – Theo
Como dices arriba, quiero todos los documentos que tienen ab entre 4 y 6. Solo a: 1 satisface esto (no ambos) porque a: 2 no contiene ningún valor entre 4 y 6 (usando gt y lt exclude 4 y 6 ellos mismos donde lo incluirían gte y lte). Intenté una consulta diferente (vea la pregunta editada) que es más clara y todavía no funciona correctamente ... – paullb
Veo lo que quiere decir ahora, lo pensé como un rango (y los rangos suelen incluir el primer elemento) , pero por supuesto que no, es un estricto menor que y mayor que. He borrado mi respuesta ya que ahora está claro que fue incorrecta. – Theo