In MongoDB, de $mod
aggregatiepijplijnoperator deelt het ene getal door het andere en geeft de rest terug.
Om $mod
te gebruiken , geef de twee getallen in een array door. De $mod
operator deelt het eerste getal door het tweede getal en geeft de rest terug. Met andere woorden, het eerste getal is het deeltal en het tweede getal is de deler.
De argumenten kunnen elke geldige uitdrukking zijn, zolang ze maar worden omgezet in getallen.
Voorbeeld
Stel dat we een verzameling hebben met de naam data
met de volgende documenten:
{ "_id" : 1, "a" : 10, "b" : 2 } { "_id" : 2, "a" : 10, "b" : 3 } { "_id" : 3, "a" : 10.5, "b" : 2 }
We kunnen de $mod
. gebruiken operator binnen een aggregatiepijplijn om de a
. te verdelen veld door de b
veld, en retourneer de rest:
db.data.aggregate(
[
{ $match: { _id: { $in: [ 1, 2, 3 ] } } },
{ $project: {
_id: 0,
a: 1,
b: 1,
result: { $mod: [ "$a", "$b" ] } }
}
]
)
Resultaat:
{ "a" : 10, "b" : 2, "result" : 0 } { "a" : 10, "b" : 3, "result" : 1 } { "a" : 10.5, "b" : 2, "result" : 0.5 }
Met andere woorden, we krijgen a
modulo b
.
Als we b
. willen krijgen modulo a
, zouden we ze moeten omwisselen.
Voorbeeld:
db.data.aggregate(
[
{ $match: { _id: { $in: [ 1, 2, 3 ] } } },
{ $project: {
_id: 0,
a: 1,
b: 1,
result: { $mod: [ "$b", "$a" ] } }
}
]
)
Resultaat:
{ "a" : 10, "b" : 2, "result" : 2 } { "a" : 10, "b" : 3, "result" : 3 } { "a" : 10.5, "b" : 2, "result" : 2 }
Negatieve getallen
Stel dat we de volgende documenten aan onze collectie toevoegen:
{ "_id" : 4, "a" : -10, "b" : 3 } { "_id" : 5, "a" : 10, "b" : -3 } { "_id" : 6, "a" : -10, "b" : -3 }
Deze omvatten negatieve getallen. Maar dat is geen probleem, want negatieve getallen zijn nog steeds getallen, en we kunnen zeker de modulo krijgen als we met negatieve getallen werken.
Voorbeeld:
db.data.aggregate(
[
{ $match: { _id: { $in: [ 4, 5, 6 ] } } },
{ $project: {
_id: 0,
a: 1,
b: 1,
result: { $mod: [ "$a", "$b" ] } }
}
]
)
Resultaat:
{ "a" : -10, "b" : 3, "result" : -1 } { "a" : 10, "b" : -3, "result" : 1 } { "a" : -10, "b" : -3, "result" : -1 }
Onjuist gegevenstype
De argumenten geleverd aan $mod
kan elke geldige uitdrukking zijn, zolang ze maar worden omgezet in getallen.
Stel dat we het volgende document hebben:
{ "_id" : 7, "a" : "Ten", "b" : 2 }
En we passen $mod
toe naar dat document:
db.data.aggregate(
[
{ $match: { _id: { $in: [ 7 ] } } },
{ $project: {
_id: 0,
a: 1,
b: 1,
result: { $mod: [ "$a", "$b" ] } }
}
]
)
Resultaat:
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
De fout geeft aan dat $mod only supports numeric types
.
Null-waarden
null
opgeven voor elk van de argumenten retourneert null
.
Stel dat we de volgende documenten hebben:
{ "_id" : 8, "a" : 10, "b" : null } { "_id" : 9, "a" : null, "b" : 10 } { "_id" : 10, "a" : null, "b" : null }
En we passen $mod
toe naar die documenten:
db.data.aggregate(
[
{ $match: { _id: { $in: [ 8, 9, 10 ] } } },
{ $project: {
_id: 0,
a: 1,
b: 1,
result: { $mod: [ "$a", "$b" ] } }
}
]
)
Resultaat:
{ "a" : 10, "b" : null, "result" : null } { "a" : null, "b" : 10, "result" : null } { "a" : null, "b" : null, "result" : null }
Ontbrekende velden
Ontbrekende velden retourneren null
.
Stel dat we de volgende documenten hebben:
{ "_id" : 11, "a" : 10 } { "_id" : 12, "b" : 2 } { "_id" : 13 }
Pas $mod
toe :
db.data.aggregate(
[
{ $match: { _id: { $in: [ 11, 12, 13 ] } } },
{ $project: {
_id: 0,
a: 1,
b: 1,
result: { $mod: [ "$a", "$b" ] } }
}
]
)
Resultaat:
{ "a" : 10, "result" : null } { "b" : 2, "result" : null } { "result" : null }
Voeg uw eigen nummer toe
U bent niet noodzakelijkerwijs beperkt tot alleen de cijfers in de documenten. U kunt uw eigen getallen gebruiken als u een veld door een vast bedrag moet delen.
Voorbeeld:
db.data.aggregate(
[
{ $match: { _id: { $in: [ 1, 2, 3 ] } } },
{ $project: {
_id: 0,
a: 1,
b: 1,
result: { $mod: [ "$a", 5.2 ] } }
}
]
)
Resultaat:
{ "a" : 10, "b" : 2, "result" : 4.8 } { "a" : 10, "b" : 3, "result" : 4.8 } { "a" : 10.5, "b" : 2, "result" : 0.09999999999999964 }