$isNumber(集計)
定義
$isNumber
$isNumber
指定された 式 が次のいずれかの数値 BSON typesに解決されるかどうかを確認します。$isNumber
次の値を返します。true
式が数値に変換される場合。false
式が他のBSON タイプ、null
、または欠落したフィールドに解決される場合。
$isNumber
には次の演算子式の構文があります。{ $isNumber: <expression> } 引数には任意の有効な式を使用できます。
例
$isNumber を使用して、フィールドが数値であるかどうかを確認します
テスト データを入力するには、 examples.sensors
コレクションに対して次の操作を実行します。
db.getSiblingDB("examples").sensors.insertMany([ { "_id" : 1, "reading" : NumberDecimal(26.0) }, { "_id" : 2, "reading" : NumberLong(25.0) }, { "_id" : 3, "reading" : NumberInt(24) }, { "_id" : 4, "reading" : 24.0 }, { "_id" : 5, "reading" : "24" }, { "_id" : 6, "reading" : [ NumberDecimal(26) ]} ])
次の集計では、 $addFields
集計ステージを使用して各ドキュメントに次のフィールドを追加します。
isNumber
-reading
の値が整数、小数点、double 型、long 型のいずれであるかを示します。type
-reading
の BSON タイプを示します。
db.sensors.aggregate([{ $addFields : { "isNumber" : { $isNumber : "$reading" }, "hasType" : {$type : "$reading"} } }])
この集計操作は、次の結果を返します。
{ "_id" : 1, "reading" : NumberDecimal("26.0000000000000"), "isNum " : true, "type" : "decimal" } { "_id" : 2, "reading" : NumberLong(25), "isNum " : true, "type" : "long" } { "_id" : 3, "reading" : 24, "isNum " : true, "type" : "int" } { "_id" : 4, "reading" : 24, "isNum " : true, "type" : "double" } { "_id" : 5, "reading" : "24", "isNum " : false, "type" : "string" } { "_id" : 6, "reading" : [ NumberDecimal("26.0000000000000") ], "isNum " : false, "type" : "array" }
$isNumber を使用してフィールドを条件付きで変更する
grades
コレクションには、成績に関するデータが含まれています。 grade
フィールドには、string のレターグレードまたは数値のポイント値を保存できます。
db.getSiblingDB("examples").grades.insertMany([ { "student_id" : 457864153, "class_id" : "01", "class_desc" : "Algebra", "grade" : "A" }, { "student_id" : 457864153, "class_id" : "02", "class_desc" : "Chemistry", "grade" : 3.0 }, { "student_id" : 978451637, "class_id" : "03", "class_desc" : "Physics", "grade" : "C" }, { "student_id" : 978451637, "class_id" : "04", "class_desc" : "English", "grade" : 4.0 } ])
次の集計では、 $addFields
ステージを使用して、そのコースの数値成績を含むpoints
フィールドを追加します。 ステージでは$cond
演算子を使用して、 $isNumber
の出力に基づいてpoints
の値を設定します。
true
の場合、grades
にはすでに数値ポイント値が含まれています。points
をgrades
と等しく設定します。false
の場合、grades
には string 文字の値が含まれます。$switch
を使用してレターグレードを同等のポイント値に変換し、points
に割り当てます。
次に、集計パイプラインは$group
ステージを使用してstudent_id
でグループ化し、学生のaverage
GPA を計算します。
db.getSiblingDB("examples").grades.aggregate([ { $addFields: { "points" : { $cond : { if : { $isNumber : "$grade" }, then: "$grade" , else: { $switch : { branches: [ { case: {$eq : ["$grade" , "A"]}, then : 4.0 }, { case: {$eq : ["$grade" , "B"]}, then : 3.0 }, { case: {$eq : ["$grade" , "C"]}, then : 2.0 }, { case: {$eq : ["$grade" , "D"]}, then : 1.0 }, { case: {$eq : ["$grade" , "F"]}, then : 0.0 } ] } } } } } }, { $group : { _id : "$student_id", GPA : { $avg : "$points" } } } ])
集計パイプラインは、その生徒のGPA
成績の平均を持つ一意のstudent_id
ごとに 1 つのドキュメントを出力します。
{ "_id" : 457864153, "GPA" : 3.5 } { "_id" : 978451637, "GPA" : 3 }