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シェルで実行するための1行で:

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

または、1 行で記述して mongo シェルで実行します。

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の戻りは、いくつかのデータを使用し、必要な値を集約する必要がある場所です(たとえば、渡される定数であるコレクション名)。

于 2013-07-30T22:11:53.100 に答える