OK、ここに役立つかもしれないいくつかの関連する質問があります:
map-reduceを使用して、コレクション内のすべてのフィールド名を取得します。
これは、すべての可能なフィールドをリストする再帰バージョンです。
うまくいけば、それはあなたが始めることができるでしょう。ただし、このリクエストでいくつかの問題が発生する可能性があります。ここには2つの問題があります。
- JSONの「gettype」関数が見つかりません。でクエリを実行できますが、実際にフィールドで関数を実行して、それをBSONタイプにマップする
$type
ことはできないようです。gettype
- フィールドには複数のタイプのデータを含めることができるため、これを処理するための計画が必要になります。明らかではない場合でも、Mongoは、実際には知らないうちに、一部の数値をintとして格納し、他の数値を浮動小数点として格納する可能性があります。実際、PHPドライバーを使用すると、これは非常に可能です。
したがって、問題#1を解決できると仮定すると、「すべてのフィールド名を取得」のわずかなバリエーションを使用して問題#2を解決できるはずです。
おそらく次のようになります。
"map" : function() { for (var key in this) { emit(key, [ typeof value[key] ]); } }
"reduce" : function(key, stuff) { return (key, add_to_set(stuff) ); }
したがって、基本的には、マップ関数でkey
とtype of key value
(配列として)を出力します。次に、reduce関数から、タイプごとに一意のエントリを追加します。
実行の最後に、次のようなデータがあります
{"_id":[255], "name" : [1,5,8], ... }
もちろん、これはすべて大変な作業です。実際の問題によっては、(コードから)常に正しいタイプのデータを入力していることを確認したい場合があります。データがDBにある後にデータのタイプを見つけることは、間違いなく苦痛です。