2012-01-23 16 views

risposta

7

Non esiste un comando predefinito per questo. Scarica questo documento e conta i tasti tu stesso.

1

Sergio ha ragione, devi farlo fuori da mongo.

Si può fare qualcosa di simile:

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

In Mongo (come nella maggior parte delle soluzioni NoSQL) di solito è una buona idea di pre-calcolare tali valori se si vuole fare domande su di loro in seguito (ad esempio " dove il numero di chiavi diverse> 12 "), quindi forse dovresti considerare di aggiungere un nuovo campo" keyCount "che incrementerai ogni volta che viene aggiunta una nuova chiave.

1

Se si è in console Mongo, è possibile scrivere javascript per farlo.

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

Questo sarà ancora essere considerato "fuori dal mongo" però.

+1

Puoi anche solo fare 'nKeys = Object.keys (doc) .length;' –

0

Abbastanza possibile se si utilizza MongoDB 3.6 e più recente attraverso il framework di aggregazione. Utilizzare l'operatore $objectToArray all'interno di una pipeline di aggregazione per convertire il documento in una matrice. La matrice di restituzione contiene un elemento per ogni coppia campo/valore nel documento originale. Ogni elemento nell'array di restituzione è un documento che contiene due campi k e v.

Il riferimento per il root del documento è reso possibile dalla variabile di sistema $$ROOT che fa riferimento al documento di livello superiore attualmente in fase di elaborazione nella fase di aggregazione della pipeline.

Su come ottenere la matrice, è possibile sfruttare l'uso di $addFields passo pipeline per creare un campo che tiene i conti e il conteggio effettivo è determinato con l'utilizzo dell'operatore $size.

Tutto questo può essere fatto in un unico gasdotto mediante la nidificazione delle espressioni come segue:

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

Esempio di output

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

escludere il settore _id, è possibile utilizzare l'$filter operatore come:

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