sql >> Base de Datos >  >> NoSQL >> MongoDB

consulta mongodb:$ tamaño con $ gt devuelve siempre 0

No puede hacer eso como se menciona en la documentación para $size . Entonces ese operador solo evalúa un resultado "literal" y no puede ser usado junto con "operadores de rango" como usted está preguntando.

Sus únicas opciones reales son solicitar un "tamaño" que "no sea igual a 0" negando la condición con $not operador. Lo cual es perfectamente válido:

db.userStats.count({ "sessions": { "$not": { "$size": 0 } } });

O prueba con la otra encarnación de $size en el marco de agregación, siempre que su versión de MongoDB sea 2.6 o superior:

db.userStats.aggregate([
    { "$group": {
         "_id": null,
         "count": {
             "$sum": {
                 "$cond": [
                     { "$gt": [ { "$size": "$sessions", 0 } ] },
                     1,
                     0
                 ]
             }
         }
    }}
])

Posiblemente también con $where forma de evaluación de JavaScript:

db.userStats.count(function() { return this.sessions.length > 0 });

Pero probablemente más lento que la última versión.

O, de hecho, puede hacer esto con "dot notation" y $exists operador:

db.userStats.count({ "sesssions.0": { "$exists": true } });

Como la idea general es que si hay un elemento en el índice 0 entonces la matriz tiene cierta longitud.

Todo depende de tu enfoque, pero cualquiera de estas formas obtiene el resultado correcto.

Pero para obtener el "mejor" rendimiento de MongoDB, no use ninguna de estos métodos. En su lugar, mantenga la matriz "longitud" como una propiedad del documento que está inspeccionando. Esto lo puede "indexar" y las consultas emitidas pueden acceder a ese índice, lo que ninguno de los anteriores puede hacer.

Mantenlo así:

db.userStats.update(
     { "_id": docId, "sessions": { "$ne": newItem } },
     {
         "$push": { "sessions": newItem },
         "$inc": { "countSessions": 1 }
     }
)

O para eliminar:

db.userStats.update(
     { "_id": docId, "sessions": newItem  },
     {
         "$pull": { "sessions": newItem },
         "$inc": { "countSessions": -1 }
     }
)

Luego, puede consultar "countSesssions", que también puede indexar para obtener el mejor rendimiento:

db.userStats.find({ "countSessions": { "$gt": 0 } })

Y esa es la "mejor" forma de hacerlo.