我有mongo数据库中的集合名称列表。我需要一个脚本,通过在mongo数据库中使用map reduce job将集合名称作为参数来获取每个集合中的所有文件名。
这是我到目前为止所做的:
mr = db.runCommand({
"mapreduce" : "collectionname",
"map" : function() { for (var key in this) { emit(key, null); } },
"reduce" : function(key, stuff) { return null; },
"out": "collectioname" + "_keys"
})
或在mongo shell中执行它的一行:
mr = db.runCommand({
"mapreduce" : "collectionname",
"map" : function() { for (var key in this) { emit(key, null); } },
"reduce" : function(key, stuff) { return null; },
"out": "collectioname" + "_keys"
})
此命令用于获取集合中的字段列表。但是这个只适用于小学一个。我需要循环它(获取数据库中每个集合中的所有字段)。非常感谢。
答案 0 :(得分:0)
您正在寻找的for循环是:
var allCollections = db.getCollectionNames();
for (var i = 0; i < allCollections.length; ++i) {
var collectioname = allCollections[i];
// now do your map reduce for one collection here
// there are the merge or reduce options for the output collection
// in case you want to gather everything in one collection instead of:
// collectioname + '_keys'
}
将其保存在script.js
然后运行它:
mongo myDb script.js
或将其写在一行并执行mongo shell:
var allCollections = db.getCollectionNames(); for (var i = 0; i < allCollections.length; ++i) { var collectioname = allCollections[i]; if (collectioname === 'system.indexes') continue; db.runCommand({ "mapreduce" : collectioname, "map" : function() { for (var key in this) { emit(key, null); } }, "reduce" : function(key, stuff) { return null; }, "out": collectioname + "_keys" }) }
但是,请彻底浏览mapReduce页面并在那里运行所有示例。这应该清楚说明如何使用emit
函数在最后得到适当的结果。您当前为某个密钥发出null
。那里和reduce的返回是你应该使用一些数据并聚合你想要的值的地方(例如集合名称,这将是一个常量传递)。