2012-01-23 20 views

cevap

7

Bunun için yerleşik bir komut bulunmamaktadır. Bu belgeyi getir ve anahtarları kendin say.

1

Sergio haklı, bunu mongo'nun dışında yapmak zorundasınız.

Böyle bir şey yapabiliriz: Bu daha sonra üzerlerinde sorguları yapmak istiyorsanız böyle değerlerin önceden hesaplamak için genellikle iyi bir fikirdir

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

Mongo olarak (çoğu NoSQL çözümlerinde olduğu gibi) (örneğin, " farklı anahtarların sayısı> 12 "), belki de yeni bir anahtar eklendiğinde her zaman artırdığınız yeni bir alan" keyCount "eklemeyi düşünmelisiniz.

1

Mongo konsolundaysanız, bunu yapmak için javascript yazabilirsiniz.

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

Bu

Yine de "Mongo'da dışında" olarak kabul edilecektir.

+1

Ayrıca sadece 'nKeys = Object.keys (doc) .length;' –

0

Eğer MongoDB 3.6 kullanılıyorsa ve daha yeni birleştirme yapısına rağmen. Belgeyi bir diziye dönüştürmek için bir toplama hattında $objectToArray işlecini kullanın. Dönüş dizisi, orijinal belgedeki her alan/değer çifti için bir öğe içerir. Dönüş dizisindeki her öğe, k ve v iki alanı içeren bir belgedir.

belge kök referans

anda agregasyon boru hattı aşamasında işlenen üst düzey dokümana referans $$ROOT sistem değişken yoluyla mümkün olur.

dizi alma konusunda, daha sonra sayıları ve fiili sayım $size operatörün kullanımı ile elde edilir tutan bir alan oluşturmak için $addFields boru hattı adımın kullanılmasını yararlanabilirsiniz. aşağıdaki gibi

Bütün bunlar

ifadeleri yerleştirerek tek boru hattında yapılabilir:

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

Örnek Çıktı

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

_id alanını hariç tutmak için, kullanabilirsiniz $filter operatörünün görevi:

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