I MongoDB, $mod
aggregeringspipelineoperatör delar ett tal med ett annat och returnerar resten.
För att använda $mod
, skicka de två talen i en array. $mod
operatören delar det första talet med det andra talet och returnerar resten. Med andra ord, den första siffran är utdelningen och den andra siffran är divisorn.
Argumenten kan vara vilket giltigt uttryck som helst så länge de löser sig till siffror.
Exempel
Anta att vi har en samling som heter data
med följande dokument:
{ "_id" : 1, "a" : 10, "b" : 2 } { "_id" : 2, "a" : 10, "b" : 3 } { "_id" : 3, "a" : 10.5, "b" : 2 }
Vi kan använda $mod
operatör inom en aggregeringspipeline för att dela a
fältet med b
och returnera 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 andra ord får vi a
modulo b
.
Om vi vill få b
modulo a
, vi skulle behöva byta runt dem.
Exempel:
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 }
Negativa tal
Anta att vi lägger till följande dokument i vår samling:
{ "_id" : 4, "a" : -10, "b" : 3 } { "_id" : 5, "a" : 10, "b" : -3 } { "_id" : 6, "a" : -10, "b" : -3 }
Dessa inkluderar negativa siffror. Men det är inte ett problem, eftersom negativa tal fortfarande är tal, och vi kan säkert få modulo när vi arbetar med negativa tal.
Exempel:
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 }
Fel datatyp
Argumenten som tillhandahålls till $mod
kan vara vilket giltigt uttryck som helst, så länge de löser sig till tal.
Anta att vi har följande dokument:
{ "_id" : 7, "a" : "Ten", "b" : 2 }
Och vi tillämpar $mod
till det dokumentet:
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
Felet säger att $mod only supports numeric types
.
Nullvärden
Tillhandahåller null
för något av argumenten returnerar null
.
Anta att vi har följande dokument:
{ "_id" : 8, "a" : 10, "b" : null } { "_id" : 9, "a" : null, "b" : 10 } { "_id" : 10, "a" : null, "b" : null }
Och vi tillämpar $mod
till dessa dokument:
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 }
Fält saknas
Saknade fält returnerar null
.
Anta att vi har följande dokument:
{ "_id" : 11, "a" : 10 } { "_id" : 12, "b" : 2 } { "_id" : 13 }
Använd $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 }
Lägg till ditt eget nummer
Du är inte nödvändigtvis begränsad till bara siffrorna i dokumentet/dokumenten. Du kan använda dina egna nummer om du behöver dela ett fält med ett fast belopp.
Exempel:
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 }