mongodb使用map reduce job获取所有集合中的字段列表

时间:2013-07-30 18:32:02

标签: mongodb mapreduce

我有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" })

此命令用于获取集合中的字段列表。但是这个只适用于小学一个。我需要循环它(获取数据库中每个集合中的所有字段)。非常感谢。

1 个答案:

答案 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的返回是你应该使用一些数据并聚合你想要的值的地方(例如集合名称,这将是一个常量传递)。