2015-08-10 3 views
6

Есть ли способ перечислить все имена коллекций и количество документов для каждой коллекции в одном запросе?Получить счетчик количества документов в коллекции Mongodb

Тот, который я мог найти, дает только количество для определенной коллекции. Например, если Users была коллекция затем

db.Users.count() 

бы дать мне подсчет количества документов в коллекции Users.

ответ

6

В оболочке все что вам нужно сделать это:

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

Там нет «команды» и нет «сингулярные» коллекция запросов (технически это еще несколько запросов, сделанных для каждой коллекции , и «исходный» запрос), поскольку это не то, как MongoDB хранит данные. Но есть простой программный метод, и это в основном доступно для всех драйверов.

+0

поэтому запрос было бы 'db.getCollectionNames.map()'? – Vaulstein

+1

@Vaulstein 'db.getCollectionNames()' - это сама по себе функция, которая выполняет системную команду для возврата «информации о коллекции». Результатом является массив условий, подходящих для оператора '.map()' в JavaScript. Как вы должны «ясно видеть» здесь. '.count()' выполняется для каждой возвращаемой коллекции. Это «как это работает». Как я уже сказал, такая же команда для возврата «информации о сборке» доступна в каждом драйвере. –

2

Если вы просто хотите напечатать цифры и подсчитать, то вы можете использовать forEach.

db.getCollectionNames().forEach(function(colName){ 
    print(colName+": "+db.collection(colName).count()); 
}); 

Если вы хотите использовать его для любых других операций, то вы можете использовать функцию карты.

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

Нет, не существует. Вы должны использовать

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

, чтобы получить все коллекции, созданные пользователем, и перебирать эти коллекции

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

Почему downvote? Просто любопытно. Все другие решения включают 'system.indexes', а использование' map' эффективно снимает несколько запросов. –

Смежные вопросы