Encuentre registros de MongoDB donde el campo de matriz no esté vacío

Resuelto Jelle De Loecker asked hace 11 años • 13 respuestas

Todos mis registros tienen un campo llamado "imágenes". Este campo es una matriz de cadenas.

Ahora quiero los 10 registros más nuevos donde esta matriz NO ESTÉ vacía.

Busqué en Google, pero curiosamente no encontré mucho sobre esto. Leí la opción $where, pero me preguntaba qué tan lenta es para las funciones nativas y si hay una solución mejor.

Y aun así, eso no funciona:

ME.find({$where: 'this.pictures.length > 0'}).sort('-created').limit(10).execFind()

No devuelve nada. Dejar this.picturessin el bit de longitud funciona, pero también devuelve registros vacíos, por supuesto.

Jelle De Loecker avatar Feb 09 '13 22:02 Jelle De Loecker
Aceptado

Si también tienes documentos que no tienen la clave, puedes utilizar:

ME.find({ pictures: { $exists: true, $not: {$size: 0} } })

MongoDB no usa índices si $sizeestá involucrado, así que aquí hay una mejor solución:

ME.find({ pictures: { $exists: true, $ne: [] } })

Si su propiedad puede tener valores no válidos (como null booleanu otros), entonces puede agregar una verificación adicional utilizando$types como se propone en esta respuesta :

Con mongo >= 3.2:

ME.find({ pictures: { $exists: true, $type: 'array', $ne: [] } })

Con mongo <3.2:

ME.find({ pictures: { $exists: true, $type: 4, $ne: [] } })

Desde la versión MongoDB 2.6, puede comparar con el operador $gt, pero esto podría generar resultados inesperados (puede encontrar una explicación detallada en esta respuesta ):

ME.find({ pictures: { $gt: [] } })
Chris' avatar Aug 05 '2014 15:08 Chris'

Después de buscar un poco más, especialmente en los documentos de mongodb, y de resolver algunas partes del misterio, esta fue la respuesta:

ME.find({pictures: {$exists: true, $not: {$size: 0}}})
Jelle De Loecker avatar Feb 09 '2013 16:02 Jelle De Loecker