MongoDBでは、$mod 集計パイプライン演算子は、ある数値を別の数値で除算し、余りを返します。
$modを使用するには 、配列で2つの数値を渡します。 $mod 演算子は最初の数値を2番目の数値で除算し、余りを返します。つまり、最初の数値は被除数で、2番目の数値は除数です。
引数は、数値に解決される限り、任意の有効な式にすることができます。
例
dataというコレクションがあるとします。 次のドキュメントを使用:
{ "_id" : 1, "a" : 10, "b" : 2 }
{ "_id" : 2, "a" : 10, "b" : 3 }
{ "_id" : 3, "a" : 10.5, "b" : 2 }
$modを使用できます aを分割するための集計パイプライン内の演算子 bによるフィールド フィールドに入力し、余りを返します:
db.data.aggregate(
[
{ $match: { _id: { $in: [ 1, 2, 3 ] } } },
{ $project: {
_id: 0,
a: 1,
b: 1,
result: { $mod: [ "$a", "$b" ] } }
}
]
) 結果:
{ "a" : 10, "b" : 2, "result" : 0 }
{ "a" : 10, "b" : 3, "result" : 1 }
{ "a" : 10.5, "b" : 2, "result" : 0.5 }
つまり、aを取得します モジュロb 。
bを取得したい場合 モジュロa 、それらを交換する必要があります。
例:
db.data.aggregate(
[
{ $match: { _id: { $in: [ 1, 2, 3 ] } } },
{ $project: {
_id: 0,
a: 1,
b: 1,
result: { $mod: [ "$b", "$a" ] } }
}
]
) 結果:
{ "a" : 10, "b" : 2, "result" : 2 }
{ "a" : 10, "b" : 3, "result" : 3 }
{ "a" : 10.5, "b" : 2, "result" : 2 } 負の数
コレクションに次のドキュメントを追加するとします。
{ "_id" : 4, "a" : -10, "b" : 3 }
{ "_id" : 5, "a" : 10, "b" : -3 }
{ "_id" : 6, "a" : -10, "b" : -3 } これらには負の数が含まれます。しかし、それは問題ではありません。負の数はまだ数値であり、負の数を操作するときにモジュロを確実に取得できるからです。
例:
db.data.aggregate(
[
{ $match: { _id: { $in: [ 4, 5, 6 ] } } },
{ $project: {
_id: 0,
a: 1,
b: 1,
result: { $mod: [ "$a", "$b" ] } }
}
]
) 結果:
{ "a" : -10, "b" : 3, "result" : -1 }
{ "a" : 10, "b" : -3, "result" : 1 }
{ "a" : -10, "b" : -3, "result" : -1 } 間違ったデータ型
$modに提供される引数 数値に解決される限り、任意の有効な式にすることができます。
次のドキュメントがあるとします。
{ "_id" : 7, "a" : "Ten", "b" : 2 }
そして、$modを適用します そのドキュメントへ:
db.data.aggregate(
[
{ $match: { _id: { $in: [ 7 ] } } },
{ $project: {
_id: 0,
a: 1,
b: 1,
result: { $mod: [ "$a", "$b" ] } }
}
]
) 結果:
uncaught exception: Error: command failed: {
"ok" : 0,
"errmsg" : "$mod only supports numeric types, not string and double",
"code" : 16611,
"codeName" : "Location16611"
} : aggregate failed :
example@sqldat.com/mongo/shell/utils.js:25:13
example@sqldat.com/mongo/shell/assert.js:18:14
example@sqldat.com/mongo/shell/assert.js:639:17
example@sqldat.com/mongo/shell/assert.js:729:16
example@sqldat.com/mongo/shell/db.js:266:5
example@sqldat.com/mongo/shell/collection.js:1058:12
@(shell):1:1
エラーは、$mod only supports numeric typesことを示しています 。
ヌル値
nullを提供する いずれの引数についても、nullを返します 。
次のドキュメントがあるとします。
{ "_id" : 8, "a" : 10, "b" : null }
{ "_id" : 9, "a" : null, "b" : 10 }
{ "_id" : 10, "a" : null, "b" : null }
そして、$modを適用します それらのドキュメントへ:
db.data.aggregate(
[
{ $match: { _id: { $in: [ 8, 9, 10 ] } } },
{ $project: {
_id: 0,
a: 1,
b: 1,
result: { $mod: [ "$a", "$b" ] } }
}
]
) 結果:
{ "a" : 10, "b" : null, "result" : null }
{ "a" : null, "b" : 10, "result" : null }
{ "a" : null, "b" : null, "result" : null } 欠落しているフィールド
欠落しているフィールドはnullを返します 。
次のドキュメントがあるとします。
{ "_id" : 11, "a" : 10 }
{ "_id" : 12, "b" : 2 }
{ "_id" : 13 }
$modを適用します :
db.data.aggregate(
[
{ $match: { _id: { $in: [ 11, 12, 13 ] } } },
{ $project: {
_id: 0,
a: 1,
b: 1,
result: { $mod: [ "$a", "$b" ] } }
}
]
) 結果:
{ "a" : 10, "result" : null }
{ "b" : 2, "result" : null }
{ "result" : null } 自分の番号を追加
必ずしもドキュメント内の数字だけに制限されているわけではありません。フィールドを固定量で割る必要がある場合は、独自の数値を使用できます。
例:
db.data.aggregate(
[
{ $match: { _id: { $in: [ 1, 2, 3 ] } } },
{ $project: {
_id: 0,
a: 1,
b: 1,
result: { $mod: [ "$a", 5.2 ] } }
}
]
) 結果:
{ "a" : 10, "b" : 2, "result" : 4.8 }
{ "a" : 10, "b" : 3, "result" : 4.8 }
{ "a" : 10.5, "b" : 2, "result" : 0.09999999999999964 }