I MongoDB kan du använda $subtract
aggregeringspipelineoperatör för att subtrahera siffror och/eller datum.
Specifikt $subtract
kan göra följande tre saker:
- Subtrahera två tal för att returnera skillnaden
- Subtrahera ett tal (i millisekunder) från ett datum och returnera det resulterande datumet
- Subtrahera två datum för att returnera skillnaden i millisekunder
$subtract
operatorn accepterar värdena som argument. Argumenten kan vara vilket giltigt uttryck som helst så länge de löser sig till siffror och/eller datum. För att subtrahera ett tal från ett datum måste datumet vara det första argumentet...
Exempeldata
Anta att vi har en samling som heter data
med följande dokument:
{ "_id" : 1, "a" : 20000, "b" : 250, "start" : ISODate("2021-01-03T00:00:00Z"), "end" : ISODate("2021-01-03T23:30:15.100Z") }
Subtrahera siffror
Vi kan använda $subtract
operatorn för att subtrahera a
fältet från b
fältet (eller vice versa).
Exempel:
db.data.aggregate(
[
{ $project: {
_id: 0,
a: 1,
b: 1,
result: {
$subtract: [ "$a", "$b" ] } }
}
]
)
Resultat:
{ "a" : 20000, "b" : 250, "result" : 19750 }
Subtrahera ett tal från ett datum
Om det första argumentet är ett datum och det andra argumentet är ett tal, $subtract
operatorn subtraherar talet från datumet i millisekunder.
Exempel:
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 att 250 millisekunder har subtraherats från datumet.
När vi subtraherar ett tal från ett datum måste datumet vara det första argumentet med talet som det andra argumentet.
Så här händer om vi byter argument:
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 ett felmeddelande som talar om för oss att det inte kan subtrahera ett datum från en dubbel.
Återställ skillnaden mellan två datum
Om båda argumenten är datum, då $subtract
operatorn returnerar skillnaden mellan de två datumen i millisekunder.
Exempel:
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) }
Om vi byter om datumen blir resultatet ett negativt värde:
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) }
Att passera fel antal argument
$subtract
operatören accepterar exakt två argument. Att skicka fel antal argument resulterar i ett fel.
Exempel:
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
Godkänd nollvärden
Skickar två null
värden resulterar i null
returneras.
Exempel:
db.data.aggregate(
[
{ $project: {
result: {
$subtract: [ null, null ] } }
}
]
)
Resultat:
{ "_id" : 1, "result" : null }