2012-01-23 21 views

Odpowiedz

7

Nie ma wbudowanego polecenia do tego. Pobierz ten dokument i policz klucze samodzielnie.

1

Sergio ma rację, musisz to zrobić poza mangiem.

można zrobić coś takiego:

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

W Mongo (jak w większości rozwiązań NoSQL) to zwykle dobry pomysł, aby wstępnie obliczyć te wartości, jeśli chcesz zrobić zapytań na nich później (np " gdzie liczba różnych klawiszy> 12 "), więc może powinieneś rozważyć dodanie nowego pola" keyCount ", które zwiększasz za każdym razem, gdy dodawany jest nowy klucz.

1

Jeśli jesteś w konsoli Mongo, możesz napisać javascript, aby to zrobić.

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

To nadal będzie uważane za "poza mongo".

+1

Możesz także po prostu zrobić 'nKeys = Object.keys (doc) .length;' –

0

Całkiem możliwe, jeśli korzystasz z MongoDB 3.6 i nowszej wersji ze środowiska agregacji. Należy użyć operatora w potoku agregacji, aby przekonwertować dokument na tablicę. Tablica zwracana zawiera element dla każdej pary pól/wartości w oryginalnym dokumencie. Każdy element w tablicy zwrotów jest dokumentem, który zawiera dwa pola k i v.

Odwołanie do katalogu głównego dokumentu jest możliwe dzięki zmiennej systemowej, która odwołuje się do aktualnie przetwarzanego dokumentu najwyższego poziomu na etapie potoku agregacji.

Na coraz tablicę, można następnie wykorzystać użycie $addFields etapie rurociągu, aby utworzyć pole, które przechowuje się liczy i rzeczywista liczba pochodzi z wykorzystaniem operatora $size.

Wszystko to można zrobić w jednym rurociągiem przez zagnieżdżanie wyrażeń następująco:

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

Przykład Wyjście

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

Aby wykluczyć pole _id, można użyć operatora $filter jako:

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