Tengo una colección MongoDB que contiene documentos de la siguiente manera:
{ "_id": ObjectId(.....), "name": "John", "contacts": [ { "name": "henry", "age": "22" }, { "name": "merry", "age": "12" } ] } Quiero encontrar documentos que tengan contacts.age . La edad es inferior a 20. Intenté la siguiente consulta de mongo pero no tuve suerte. ¿Alguien puede ayudarme?
document.Users.find({'$expr':{'$lte': [{'$toInt':'$contacts.age'}, '20'] }})La consulta anterior da el siguiente error:
Query failed with error code 241 and error message 'Executor error during find command :: caused by :: Unsupported conversion from array to int in $convert with no onError value' on serverSi desea todo el documento (sin cambiar nada), puede probar esta consulta de agregación:
El truco aquí es obtener solo documentos donde haya uno true en la matriz devuelta por la condición "$lte": [{"$toInt": "$$this"},20] .
Eso significa que solo se compararán los documentos que tengan una matriz con un valor (mínimo un subdocumento) coincidente.
EDITAR con el ejemplo de trabajo final, usando dos formas de asegurar los datos:
"contacts": { "$ne": null } en la etapa $match justo antes de $expr para evitar el mapa sobre nulo.onError y onNull en caso de que algún valor no sea un número y no se pueda convertir. db.collection.aggregate([ { "$match": { "contacts": { "$ne": null }, "$expr": { "$in": [ true, { "$map": { "input": "$contacts", "in": { "$lte": [ { "$convert": { "input": "$$this.age", "to": "int", "onError": "", "onNull": "" } }, 30 ] } } } ] } } } ])Ejemplo aquí