0

我在 mongo 数据库中有集合名称列表。我需要一个脚本来获取每个集合中的所有文件名称,方法是使用 mongo 数据库中的 map reduce 作业将集合名称作为参数传递。

这是我到目前为止所拥有的:

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

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

4

1 回答 1

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您当前为某个键发出 a 。那里和 reduce 的返回是您应该使用一些数据并聚合您想要的值的地方(例如集合名称,这将是一个被传递的常量)。

于 2013-07-30T22:11:53.100 回答