2015-08-10 9 views
6

Gibt es eine Möglichkeit, alle Sammlungsnamen und die Anzahl der Dokumente für jede Sammlung in einer einzigen Abfrage aufzulisten?Anzahl der Dokumente in einer Sammlung abrufen Mongodb

Die eine, die ich finden konnte, gibt nur die Zählung für eine bestimmte Sammlung. Zum Beispiel, wenn Users eine Sammlung dann

ist
db.Users.count() 

würde ich die Zählung der Anzahl der Dokumente in der Sammlung Users.

Antwort

6

In der Shell alles, was Sie tun müssen, ist dies:

db.getCollectionNames().map(function(name) { 
    return { "name": name, "count": db[name].count() } 
}) 

Es gibt keinen „Befehl“, und es ist nicht „singulär“ Sammlungsabfrage (es ist technisch noch mehrere Abfragen für jede Sammlung gemacht und eine "source" -Abfrage), um dies zu tun, da MongoDB nicht die Daten speichert. Aber es gibt eine einfache programmatische Methode, die grundsätzlich auch für alle Treiber verfügbar ist.

+0

so die Abfrage würde 'db.getCollectionNames.map()'? – Vaulstein

+1

@Vaulstein Die 'db.getCollectionNames()' ist eine Funktion für sich, die einen Systembefehl ausführt, um "Sammlungsinformationen" zurückzugeben. Das Ergebnis ist ein Array von Bedingungen, die für den Operator '.map()' in JavaScript geeignet sind. Wie Sie hier "klar sehen" sollten. '.count()' wird für jede Sammlung ausgeführt, die zurückgegeben wird. Das ist "wie es funktioniert". Wie ich bereits sagte, ist derselbe Befehl zum Zurücksenden von "Sammlungsinformationen" in jedem Treiber verfügbar. –

2

Wenn Sie nur die Zahlen und die Anzahl drucken möchten, können Sie forEach verwenden.

Wenn Sie es für andere Operationen verwenden möchten, können Sie die Kartenfunktion verwenden.

db.getCollectionNames().map(function(colName){ 
    return { 
    "columnName":colName, 
    "count":db.getCollection(colName).count() 
    } 
}); 
-1

Nein, gibt es nicht. Sie haben

var collections = db.runCommand({ 
    listCollections:1, 
    filter:{ name:{ $not: /^system\..*/ } } 
}) 

verwenden, um alle Sammlungen vom Benutzer erstellt zu bekommen und diese Sammlungen iterieren

for (var index = 0; index < collections.length; index++) { 
    var current = collections[index]; 
    var doccount = db.runCommand({collStats:current,scale:1024,verbose:true}).count; 
    print(current + ":" + doccount); 
} 
+0

Warum der Downvote? Nur neugierig. Alle anderen Lösungen beinhalten 'system.indexes', und die Verwendung von' map' macht auch mehrere Abfragen möglich. –

Verwandte Themen