25

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

4

5 に答える 5

36

MongoDB 3.4 以降では、$type集計演算子を使用してフィールドの型を返すことができます。

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

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

{ 
    "_id" : ObjectId("4c0ec11e8fd2e65c0b010000"), 
    "fieldType" : "string" 
}
于 2016-06-26T14:10:32.593 に答える
28

mongo シェルで以下のクエリを入力します

  typeof db.employee.findOne().first_name

構文

 typeof db.collection_name.findOne().field_name
于 2014-06-23T14:52:50.527 に答える
9

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

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

これは、すべての可能なフィールドをリストする再帰バージョンです。

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

  1. JSONの「gettype」関数が見つかりません。でクエリを実行できますが、実際にフィールドで関数を実行して、それをBSONタイプにマップする$typeことはできないようです。gettype
  2. フィールドには複数のタイプのデータを含めることができるため、これを処理するための計画が必要になります。明らかではない場合でも、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) ); }

したがって、基本的には、マップ関数でkeytype of key value(配列として)を出力します。次に、reduce関数から、タイプごとに一意のエントリを追加します。

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

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

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

于 2010-07-09T04:39:38.680 に答える
1

styvane クエリを利用して、データ型が異なる場合に読みやすくするために $group リストを追加しました。

db.posts.aggregate( 
[ 
    { "$project": { _id:0, "fieldType": {  "$type": "$date2"  } } },
    {"$group": { _id: {"fieldType": "$fieldType"},count: {$sum: 1}}}
])

そして、この結果を得ます:

{ "_id" : { "fieldType" : "missing" }, "count" : 50 }
{ "_id" : { "fieldType" : "date" }, "count" : 70 }
{ "_id" : { "fieldType" : "string" }, "count" : 10 }
于 2021-09-01T15:24:40.137 に答える
0

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 } 
});
于 2015-05-28T23:07:01.320 に答える