MongoDBでは、$type
を使用して、フィールドがBSONデータ型と一致するかどうかに基づいて検索をフィルタリングできます( [〜#〜] docs [〜#〜] を参照)。
例えば。
db.posts.find({date2: {$type: 9}}, {date2: 1})
これは次を返します:
{
"_id" : ObjectId("4c0ec11e8fd2e65c0b010000"),
"date2" : "Fri Jul 09 2010 08:25:26 GMT"
}
コレクション内のすべてのフィールドについて、フィールドの実際のタイプを教えてくれるクエリが必要です。これはMongoDBで可能ですか?
OK、これが役立つかもしれないいくつかの関連する質問です:
すべてのフィールド名を取得 map-reduceを使用してコレクション内。
これが 再帰バージョン すべての可能なフィールドをリストします。
うまくいけば、それはあなたが始めることができるでしょう。ただし、このリクエストでいくつかの問題が発生する可能性があります。ここには2つの問題があります。
$type
でクエリを実行できますが、実際にフィールドでgettype
関数を実行して、それをBSON型にマップすることはできないようです。したがって、問題#1を解決できると仮定すると、 "Get all field Names"のわずかなバリエーションを使用して、問題#2を解決できるはずです。 )。
おそらく次のようになります。
"map" : function() { for (var key in this) { emit(key, [ typeof value[key] ]); } }
"reduce" : function(key, stuff) { return (key, add_to_set(stuff) ); }
したがって、基本的には、map関数でkey
とtype of key value
を(配列として)出力します。次に、reduce関数から、タイプごとに一意のエントリを追加します。
実行の最後に、次のようなデータがあります
{"_id":[255], "name" : [1,5,8], ... }
もちろん、これはすべて大変な作業です。実際の問題によっては、(コードから)常に正しいタイプのデータを入力していることを確認したい場合があります。データがDBにある後にデータのタイプを見つけることは、間違いなく苦痛です。
MongoDB 3.4以降では、 $type
フィールドのタイプを返す集約演算子。
db.posts.aggregate(
[
{ "$project": { "fieldType": { "$type": "$date2" } } }
]
)
これにより、次のことが得られます。
{
"_id" : ObjectId("4c0ec11e8fd2e65c0b010000"),
"fieldType" : "string"
}
以下のクエリをmongoShellに入力します
typeof db.employee.findOne().first_name
構文
typeof db.collection_name.findOne().field_name
a=5;a.constructor.toString()
がfunction Number() { [native code] }
を出力することに注意すると、次のようなことができます。
db.collection.mapReduce(
function() {
emit(this._id.constructor.toString()
.replace(/^function (\S+).+$/, "$1"), 1);
},
function(k, v) {
return Array.sum(v);
},
{
out: { inline: 1 }
});