MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

MongoDB:como contar o número de chaves em um documento?


Bastante possível se estiver usando o MongoDB 3.6 e mais recente por meio da estrutura de agregação. Use o $objectToArray operador dentro de um pipeline de agregação para converter o documento em uma matriz. A matriz de retorno contém um elemento para cada par campo/valor no documento original. Cada elemento na matriz de retorno é um documento que contém dois campos k e v .

A referência ao root do documento é possível através do $$ROOT variável de sistema que faz referência ao documento de nível superior que está sendo processado no estágio de pipeline de agregação.

Ao obter a matriz, você pode aproveitar o uso de $addFields etapa de pipeline para criar um campo que contém as contagens e a contagem real é derivada com o uso do $size operador.

Tudo isso pode ser feito em um único pipeline aninhando as expressões da seguinte forma:
db.collection.aggregate([
    { "$addFields": {
        "count": {
            "$size": { 
                "$objectToArray": "$$ROOT"
            }
        }
    } }     
])

Exemplo de saída
{
    "_id" : ObjectId("5a7cd94520a31e44e0e7e282"),
    "a" : 1.0,
    "b" : 1.0,
    "c" : 2.0,
    "z" : 2.0,
    "count" : 5
}

Para excluir o _id campo, você pode usar o $filter operador como:
db.collection.aggregate([
    {
        "$addFields": {
            "count": {
                "$size": { 
                    "$filter": {
                        "input": { "$objectToArray": "$$ROOT" },
                        "as": "el",
                        "cond": { "$ne": [ "$$el.k", "_id" ] }
                    }
                }
            }
        }
    }     
])

ou como sugerido por 0zkr PM simplesmente adicione um $project etapa do pipeline no início:
db.collection.aggregate([
    { "$project": { "_id": 0 } },
    { "$addFields": {
        "count": {
            "$size": { 
                "$objectToArray": "$$ROOT"
            }
        }
    } }     
])