I MongoDB kan du bruge $subtract
aggregeringsrørledningsoperatør for at trække tal og/eller datoer fra.
Specifikt $subtract
kan gøre følgende tre ting:
- Træk to tal fra for at returnere forskellen
- Træk et tal (i millisekunder) fra en dato og returner den resulterende dato
- Træk to datoer fra for at returnere forskellen i millisekunder
$subtract
operatoren accepterer værdierne som argumenter. Argumenterne kan være et hvilket som helst gyldigt udtryk, så længe de løses til tal og/eller datoer. For at trække et tal fra en dato, skal datoen være det første argument...
Eksempel på data
Antag, at vi har en samling kaldet data
med følgende dokument:
{ "_id" : 1, "a" : 20000, "b" : 250, "start" : ISODate("2021-01-03T00:00:00Z"), "end" : ISODate("2021-01-03T23:30:15.100Z") }
Træk tal fra
Vi kan bruge $subtract
operatør for at trække a
fra feltet fra b
felt (eller omvendt).
Eksempel:
db.data.aggregate(
[
{ $project: {
_id: 0,
a: 1,
b: 1,
result: {
$subtract: [ "$a", "$b" ] } }
}
]
)
Resultat:
{ "a" : 20000, "b" : 250, "result" : 19750 }
Træk et tal fra en dato
Hvis det første argument er en dato, og det andet argument er et tal, er $subtract
operator trækker tallet fra datoen i millisekunder.
Eksempel:
db.data.aggregate(
[
{ $project: {
_id: 0,
b: 1,
start: 1,
result: {
$subtract: [ "$start", "$b" ] } }
}
]
).pretty()
Resultat:
{ "b" : 250, "start" : ISODate("2021-01-03T00:00:00Z"), "result" : ISODate("2021-01-02T23:59:59.750Z") }
Vi kan se, at 250 millisekunder er blevet trukket fra datoen.
Når vi trækker et tal fra en dato, skal datoen være det første argument med tallet som det andet argument.
Her er, hvad der sker, hvis vi skifter argumenterne rundt:
db.data.aggregate(
[
{ $project: {
_id: 0,
b: 1,
start: 1,
result: {
$subtract: [ "$b", "$start" ] } }
}
]
).pretty()
Resultat:
uncaught exception: Error: command failed: { "ok" : 0, "errmsg" : "cant $subtract adate from a double", "code" : 16556, "codeName" : "Location16556" } : aggregate failed : [email protected]/mongo/shell/utils.js:25:13 [email protected]/mongo/shell/assert.js:18:14 [email protected]/mongo/shell/assert.js:618:17 [email protected]/mongo/shell/assert.js:708:16 [email protected]/mongo/shell/db.js:266:5 [email protected]/mongo/shell/collection.js:1046:12 @(shell):1:1
Vi får en fejl, der fortæller os, at den ikke kan trække en dato fra en dobbelt.
Tilbagefør forskellen mellem to datoer
Hvis begge argumenter er datoer, så $subtract
operator returnerer forskellen mellem de to datoer i millisekunder.
Eksempel:
db.data.aggregate(
[
{ $project: {
_id: 0,
start: 1,
end: 1,
result: {
$subtract: [ "$end", "$start" ] } }
}
]
).pretty()
Resultat:
{ "start" : ISODate("2021-01-03T00:00:00Z"), "end" : ISODate("2021-01-03T23:30:15.100Z"), "result" : NumberLong(84615100) }
Hvis vi skifter datoerne, bliver resultatet en negativ værdi:
db.data.aggregate(
[
{ $project: {
_id: 0,
start: 1,
end: 1,
result: {
$subtract: [ "$start", "$end" ] } }
}
]
).pretty()
Resultat:
{ "start" : ISODate("2021-01-03T00:00:00Z"), "end" : ISODate("2021-01-03T23:30:15.100Z"), "result" : NumberLong(-84615100) }
Bestå det forkerte antal argumenter
$subtract
operatør accepterer præcis to argumenter. Sender det forkerte antal argumenter, resulterer det i en fejl.
Eksempel:
db.data.aggregate(
[
{ $project: {
result: {
$subtract: [ "$a" ] } }
}
]
)
Resultat:
uncaught exception: Error: command failed: { "ok" : 0, "errmsg" : "Invalid $project :: caused by :: Expression $subtract takes exactly 2 arguments. 1 were passed in.", "code" : 16020, "codeName" : "Location16020" } : aggregate failed : [email protected]/mongo/shell/utils.js:25:13 [email protected]/mongo/shell/assert.js:18:14 [email protected]/mongo/shell/assert.js:618:17 [email protected]/mongo/shell/assert.js:708:16 [email protected]/mongo/shell/db.js:266:5 [email protected]/mongo/shell/collection.js:1046:12 @(shell):1:1
Bestå nulværdier
Sender to null
værdier resulterer i null
bliver returneret.
Eksempel:
db.data.aggregate(
[
{ $project: {
result: {
$subtract: [ null, null ] } }
}
]
)
Resultat:
{ "_id" : 1, "result" : null }