2012-01-23 149 views

Respuesta

7

No hay un comando incorporado para eso. Obtenga este documento y cuente las llaves usted mismo.

1

Sergio tiene razón, tienes que hacerlo fuera de mongo.

Usted puede hacer algo como esto:

var count = 0; 
for(k in obj) {count++;} 
print(count); 
7

En Mongo (como en la mayoría de las soluciones NoSQL) por lo general es una buena idea comprobar la validez de calcular tales valores si desea hacer consultas sobre ellos más adelante (por ejemplo " donde el número de teclas diferentes> 12 "), tal vez debería considerar agregar un nuevo campo" keyCount "que se incrementa cada vez que se agrega una nueva clave.

1

Si está en la consola Mongo, puede escribir javascript para hacerlo.

doc = db.coll.findOne({}); nKeys =0; for(k in doc){nKeys ++;} print(nKeys); 

Sin embargo, esto se considerará "fuera del mongo".

+1

También puede hacer 'nKeys = Object.keys (doc) .length;' –

0

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

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

Al llegar la matriz, a continuación, puede aprovechar el uso de $addFields paso tubería para crear un campo que contiene el recuento y el recuento real se deriva con el uso del operador $size.

Todo esto se puede hacer en una sola tubería por los nidos de 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 
} 

excluir el sector _id, puede utilizar el $filter operador como:

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