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