【发布时间】:2015-08-10 09:41:59
【问题描述】:
有没有办法在单个查询中列出所有集合名称和每个集合的文档计数?
我能找到的仅给出特定集合的计数。
例如,如果Users 是一个集合,那么
db.Users.count()
会给我集合中文档的数量Users。
【问题讨论】:
标签: mongodb mongodb-query
有没有办法在单个查询中列出所有集合名称和每个集合的文档计数?
我能找到的仅给出特定集合的计数。
例如,如果Users 是一个集合,那么
db.Users.count()
会给我集合中文档的数量Users。
【问题讨论】:
标签: mongodb mongodb-query
在shell中你需要做的就是:
db.getCollectionNames().map(function(name) {
return { "name": name, "count": db[name].count() }
})
没有“命令”,也没有“单一”集合查询(从技术上讲,它仍然是为每个集合进行的多个查询,以及一个“源”查询),因为这不是 MongoDB 存储数据的方式。但是有一个简单的程序方法,基本上所有驱动程序都可以使用。
【讨论】:
db.getCollectionNames.map() ?
db.getCollectionNames() 本身就是一个函数,它执行系统命令以返回“集合信息”。结果是适合 JavaScript 中 .map() 运算符的条件数组。正如你应该在这里“看清楚”。 .count() 针对返回的每个集合运行。这就是“它是如何工作的”。正如我所说,每个驱动程序都可以使用相同的命令来返回“收集信息”。
如果你只想打印数字和计数,那么你可以使用 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()
}
});
【讨论】:
不,没有。你必须使用
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);
}
【讨论】:
system.indexes,并且使用map 也可以有效地处理多个查询。