I MongoDB er $mod
aggregeringspipeline-operatør deler et tal med et andet og returnerer resten.
For at bruge $mod
, videregive de to tal i en matrix. $mod
operatør deler det første tal med det andet tal og returnerer resten. Med andre ord er det første tal udbyttet, og det andet tal er divisor.
Argumenterne kan være et hvilket som helst gyldigt udtryk, så længe de løses til tal.
Eksempel
Antag, at vi har en samling kaldet data
med følgende dokumenter:
{ "_id" : 1, "a" : 10, "b" : 2 } { "_id" : 2, "a" : 10, "b" : 3 } { "_id" : 3, "a" : 10.5, "b" : 2 }
Vi kan bruge $mod
operatør inden for en aggregeringspipeline for at opdele a
feltet ved b
felt, og returner resten:
db.data.aggregate(
[
{ $match: { _id: { $in: [ 1, 2, 3 ] } } },
{ $project: {
_id: 0,
a: 1,
b: 1,
result: { $mod: [ "$a", "$b" ] } }
}
]
)
Resultat:
{ "a" : 10, "b" : 2, "result" : 0 } { "a" : 10, "b" : 3, "result" : 1 } { "a" : 10.5, "b" : 2, "result" : 0.5 }
Med andre ord får vi a
modulo b
.
Hvis vi ønsker at få b
modulo a
, bliver vi nødt til at bytte dem rundt.
Eksempel:
db.data.aggregate(
[
{ $match: { _id: { $in: [ 1, 2, 3 ] } } },
{ $project: {
_id: 0,
a: 1,
b: 1,
result: { $mod: [ "$b", "$a" ] } }
}
]
)
Resultat:
{ "a" : 10, "b" : 2, "result" : 2 } { "a" : 10, "b" : 3, "result" : 3 } { "a" : 10.5, "b" : 2, "result" : 2 }
Negative tal
Antag, at vi føjer følgende dokumenter til vores samling:
{ "_id" : 4, "a" : -10, "b" : 3 } { "_id" : 5, "a" : 10, "b" : -3 } { "_id" : 6, "a" : -10, "b" : -3 }
Disse inkluderer negative tal. Men det er ikke et problem, for negative tal er stadig tal, og vi kan bestemt få modulo, når vi arbejder med negative tal.
Eksempel:
db.data.aggregate(
[
{ $match: { _id: { $in: [ 4, 5, 6 ] } } },
{ $project: {
_id: 0,
a: 1,
b: 1,
result: { $mod: [ "$a", "$b" ] } }
}
]
)
Resultat:
{ "a" : -10, "b" : 3, "result" : -1 } { "a" : 10, "b" : -3, "result" : 1 } { "a" : -10, "b" : -3, "result" : -1 }
Forkert datatype
Argumenterne givet til $mod
kan være et hvilket som helst gyldigt udtryk, så længe de løses til tal.
Antag, at vi har følgende dokument:
{ "_id" : 7, "a" : "Ten", "b" : 2 }
Og vi anvender $mod
til det dokument:
db.data.aggregate(
[
{ $match: { _id: { $in: [ 7 ] } } },
{ $project: {
_id: 0,
a: 1,
b: 1,
result: { $mod: [ "$a", "$b" ] } }
}
]
)
Resultat:
uncaught exception: Error: command failed: { "ok" : 0, "errmsg" : "$mod only supports numeric types, not string and double", "code" : 16611, "codeName" : "Location16611" } : aggregate failed : [email protected]/mongo/shell/utils.js:25:13 [email protected]/mongo/shell/assert.js:18:14 [email protected]/mongo/shell/assert.js:639:17 [email protected]/mongo/shell/assert.js:729:16 [email protected]/mongo/shell/db.js:266:5 [email protected]/mongo/shell/collection.js:1058:12 @(shell):1:1
Fejlen angiver, at $mod only supports numeric types
.
Nul-værdier
Giver null
for ethvert af argumenterne returnerer null
.
Antag, at vi har følgende dokumenter:
{ "_id" : 8, "a" : 10, "b" : null } { "_id" : 9, "a" : null, "b" : 10 } { "_id" : 10, "a" : null, "b" : null }
Og vi anvender $mod
til disse dokumenter:
db.data.aggregate(
[
{ $match: { _id: { $in: [ 8, 9, 10 ] } } },
{ $project: {
_id: 0,
a: 1,
b: 1,
result: { $mod: [ "$a", "$b" ] } }
}
]
)
Resultat:
{ "a" : 10, "b" : null, "result" : null } { "a" : null, "b" : 10, "result" : null } { "a" : null, "b" : null, "result" : null }
Manglende felter
Manglende felter returnerer null
.
Antag, at vi har følgende dokumenter:
{ "_id" : 11, "a" : 10 } { "_id" : 12, "b" : 2 } { "_id" : 13 }
Anvend $mod
:
db.data.aggregate(
[
{ $match: { _id: { $in: [ 11, 12, 13 ] } } },
{ $project: {
_id: 0,
a: 1,
b: 1,
result: { $mod: [ "$a", "$b" ] } }
}
]
)
Resultat:
{ "a" : 10, "result" : null } { "b" : 2, "result" : null } { "result" : null }
Tilføj dit eget nummer
Du er ikke nødvendigvis begrænset til kun numrene i dokumentet/erne. Du kan bruge dine egne tal, hvis du skal dividere et felt med et fast beløb.
Eksempel:
db.data.aggregate(
[
{ $match: { _id: { $in: [ 1, 2, 3 ] } } },
{ $project: {
_id: 0,
a: 1,
b: 1,
result: { $mod: [ "$a", 5.2 ] } }
}
]
)
Resultat:
{ "a" : 10, "b" : 2, "result" : 4.8 } { "a" : 10, "b" : 3, "result" : 4.8 } { "a" : 10.5, "b" : 2, "result" : 0.09999999999999964 }