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

MongoDB:¿cómo contar el número de claves en un documento?

Muy posible si usa MongoDB 3.6 y más reciente a través del marco de agregación. Use $objectToArray operador dentro de una canalización de agregación para convertir el documento en una matriz. La matriz de retorno contiene un elemento para cada par de campo/valor en el documento original. Cada elemento en la matriz de retorno es un documento que contiene dos campos k y v .

La referencia a la raíz del documento es posible a través de $$ROOT variable del sistema que hace referencia al documento de nivel superior que se está procesando actualmente en la etapa de canalización de agregación.

Al obtener la matriz, puede aprovechar el uso de $addFields paso de canalización para crear un campo que contiene los recuentos y el recuento real se deriva con el uso de $size operador.

Todo esto se puede hacer en una sola canalización anidando las expresiones de la siguiente manera:

db.collection.aggregate([
    { "$addFields": {
        "count": {
            "$size": { 
                "$objectToArray": "$$ROOT"
            }
        }
    } }     
])

Ejemplo de salida

{
    "_id" : ObjectId("5a7cd94520a31e44e0e7e282"),
    "a" : 1.0,
    "b" : 1.0,
    "c" : 2.0,
    "z" : 2.0,
    "count" : 5
}

Para excluir el _id campo, puede usar el $filter operador como:

db.collection.aggregate([
    {
        "$addFields": {
            "count": {
                "$size": { 
                    "$filter": {
                        "input": { "$objectToArray": "$$ROOT" },
                        "as": "el",
                        "cond": { "$ne": [ "$$el.k", "_id" ] }
                    }
                }
            }
        }
    }     
])

o como lo sugiere 0zkr PM, simplemente agregue un $project paso de canalización al principio:

db.collection.aggregate([
    { "$project": { "_id": 0 } },
    { "$addFields": {
        "count": {
            "$size": { 
                "$objectToArray": "$$ROOT"
            }
        }
    } }     
])