In MongoDB können Sie den $subtract
verwenden Aggregations-Pipeline-Operator zum Subtrahieren von Zahlen und/oder Daten.
Insbesondere $subtract
kann die folgenden drei Dinge tun:
- Zwei Zahlen subtrahieren, um die Differenz zurückzugeben
- Subtrahieren Sie eine Zahl (in Millisekunden) von einem Datum und geben Sie das resultierende Datum zurück
- Subtrahieren Sie zwei Datumsangaben, um die Differenz in Millisekunden zurückzugeben
Der $subtract
Operator akzeptiert die Werte als Argumente. Die Argumente können alle gültigen Ausdrücke sein, solange sie in Zahlen und/oder Datumsangaben aufgelöst werden. Um eine Zahl von einem Datum zu subtrahieren, muss das Datum das erste Argument sein..
Beispieldaten
Angenommen, wir haben eine Sammlung namens data
mit folgendem Dokument:
{ "_id" : 1, "a" : 20000, "b" : 250, "start" : ISODate("2021-01-03T00:00:00Z"), "end" : ISODate("2021-01-03T23:30:15.100Z") }
Zahlen subtrahieren
Wir können den $subtract
verwenden Operator zum Subtrahieren des a
Feld aus dem b
Feld (oder umgekehrt).
Beispiel:
db.data.aggregate(
[
{ $project: {
_id: 0,
a: 1,
b: 1,
result: {
$subtract: [ "$a", "$b" ] } }
}
]
)
Ergebnis:
{ "a" : 20000, "b" : 250, "result" : 19750 }
Subtrahiere eine Zahl von einem Datum
Wenn das erste Argument ein Datum und das zweite Argument eine Zahl ist, wird $subtract
Operator subtrahiert die Zahl vom Datum in Millisekunden.
Beispiel:
db.data.aggregate(
[
{ $project: {
_id: 0,
b: 1,
start: 1,
result: {
$subtract: [ "$start", "$b" ] } }
}
]
).pretty()
Ergebnis:
{ "b" : 250, "start" : ISODate("2021-01-03T00:00:00Z"), "result" : ISODate("2021-01-02T23:59:59.750Z") }
Wir können sehen, dass 250 Millisekunden vom Datum abgezogen wurden.
Wenn wir eine Zahl von einem Datum subtrahieren, muss das Datum das erste Argument mit der Zahl als zweitem Argument sein.
Folgendes passiert, wenn wir die Argumente vertauschen:
db.data.aggregate(
[
{ $project: {
_id: 0,
b: 1,
start: 1,
result: {
$subtract: [ "$b", "$start" ] } }
}
]
).pretty()
Ergebnis:
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
Wir erhalten eine Fehlermeldung, die uns mitteilt, dass ein Datum nicht von einem Double subtrahiert werden kann.
Gib die Differenz zwischen zwei Daten zurück
Wenn beide Argumente Datumsangaben sind, dann $subtract
Operator gibt die Differenz zwischen den beiden Daten in Millisekunden zurück.
Beispiel:
db.data.aggregate(
[
{ $project: {
_id: 0,
start: 1,
end: 1,
result: {
$subtract: [ "$end", "$start" ] } }
}
]
).pretty()
Ergebnis:
{ "start" : ISODate("2021-01-03T00:00:00Z"), "end" : ISODate("2021-01-03T23:30:15.100Z"), "result" : NumberLong(84615100) }
Wenn wir die Daten umstellen, wird das Ergebnis ein negativer Wert:
db.data.aggregate(
[
{ $project: {
_id: 0,
start: 1,
end: 1,
result: {
$subtract: [ "$start", "$end" ] } }
}
]
).pretty()
Ergebnis:
{ "start" : ISODate("2021-01-03T00:00:00Z"), "end" : ISODate("2021-01-03T23:30:15.100Z"), "result" : NumberLong(-84615100) }
Übergeben der falschen Anzahl von Argumenten
Der $subtract
Der Operator akzeptiert genau zwei Argumente. Das Übergeben der falschen Anzahl von Argumenten führt zu einem Fehler.
Beispiel:
db.data.aggregate(
[
{ $project: {
result: {
$subtract: [ "$a" ] } }
}
]
)
Ergebnis:
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
Übergabe von Nullwerten
Übergeben von zwei null
Werte ergibt null
zurückgegeben.
Beispiel:
db.data.aggregate(
[
{ $project: {
result: {
$subtract: [ null, null ] } }
}
]
)
Ergebnis:
{ "_id" : 1, "result" : null }