web-dev-qa-db-ja.com

MongoDBのフィールドの実際のタイプを返します

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で可能ですか?

17
nikcub

OK、これが役立つかもしれないいくつかの関連する質問です:

すべてのフィールド名を取得 map-reduceを使用してコレクション内。

これが 再帰バージョン すべての可能なフィールドをリストします。

うまくいけば、それはあなたが始めることができるでしょう。ただし、このリクエストでいくつかの問題が発生する可能性があります。ここには2つの問題があります。

  1. JSONの「gettype」関数が見つかりません。 $typeでクエリを実行できますが、実際にフィールドでgettype関数を実行して、それをBSON型にマップすることはできないようです。
  2. フィールドには複数のタイプのデータを含めることができるため、これを処理するための計画が必要になります。明らかではない場合でも、Mongoは、実際には知らないうちに、いくつかの数値をintとして格納し、他の数値を浮動小数点として格納する可能性があります。実際、PHPドライバーを使用すると、これはかなり可能です。

したがって、問題#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関数でkeytype of key valueを(配列として)出力します。次に、reduce関数から、タイプごとに一意のエントリを追加します。

実行の最後に、次のようなデータがあります

{"_id":[255], "name" : [1,5,8], ... }

もちろん、これはすべて大変な作業です。実際の問題によっては、(コードから)常に正しいタイプのデータを入力していることを確認したい場合があります。データがDBにある後にデータのタイプを見つけることは、間違いなく苦痛です。

8
Gates VP

MongoDB 3.4以降では、 $type フィールドのタイプを返す集約演算子。

db.posts.aggregate( 
    [ 
        { "$project": { "fieldType": {  "$type": "$date2"  } } } 
    ]
)

これにより、次のことが得られます。

{ 
    "_id" : ObjectId("4c0ec11e8fd2e65c0b010000"), 
    "fieldType" : "string" 
}
23
styvane

以下のクエリをmongoShellに入力します

  typeof db.employee.findOne().first_name

構文

 typeof db.collection_name.findOne().field_name
18
Bharathiraja

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 } 
});
0
ChrisF