0

あらゆる種類のデータを保持するかなり大きな MongoDB ドキュメントがあります。コレクション内の配列タイプのフィールドを識別して、データを入力するグリッド内の表示フィールドからそれらのフィールドを削除できるようにする必要があります。

私の方法は、コレクション内のすべてのフィールド名を取得することで構成されています

これは、MongoDB Get names of all keys in collection に投稿された応答から取得したものです。

mr = db.runCommand({
  "mapreduce" : "Product",
  "map" : function() {
    for (var key in this) { emit(key, null); }
  },
  "reduce" : function(key, stuff) { return null; }, 
  "out": "things" + "_keys"
})

db[mr.result].distinct("_id")

そして、各フィールドに対して次のようなクエリを実行します

db.Product.find( { $where : "Array.isArray(this.Orders)" } ).count()

取得されたものがある場合、フィールドは配列と見なされます。

n+2 クエリ ( n はコレクション内の異なるフィールドの数) を実行する必要があり、モデル内のフィールドをハードコーディングしたくありません。MongoDB を使用する目的全体が無効になります。

これを行うより良い方法はありますか?

4

1 に答える 1

0

上記で提供されたコードにいくつかのわずかな変更を加えました。

mr = db.runCommand({
  "mapreduce" : "Product",
  "map" : function() {
    for (var key in this) { 
       if (Array.isArray(this[key])) {
          emit(key, 1); 
       } else {
          emit(key, 0);
       }
    }
  },
  "reduce" : function(key, stuff) { return Array.sum(stuff); }, 
  "out": "Product" + "_keys"
})

これで、マッパーは配列を含むキーに対して 1 を発行し、配列を含まないキーに対して 0 を発行します。レデューサーはこれらを合計するため、最終結果を確認すると次のようになります。

db[mr.result].find()

フィールド名と、配列値を含むドキュメントの数が表示されます (配列ではないものには 0 が表示されます)。

したがって、これにより、map-reduce ジョブだけでどのフィールドに配列型が含まれているかがわかります。

--

いくつかのデータでそれを見るだけです:

db.Product.insert({"a":[1,2,3], "c":[1,2]})
db.Product.insert({"a":1, "b":2})
db.Product.insert({"a":1, "c":[2,3]})

(上記の "mr =" コードを実行します)

db[mr.result].find()
{ "_id" : "_id", "value" : 0 }
{ "_id" : "a", "value" : 1 }
{ "_id" : "b", "value" : 0 }
{ "_id" : "c", "value" : 2 }
于 2013-03-22T00:42:28.003 に答える