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"
}
}
} }
])