W MongoDB możesz użyć $subtract operator potoku agregacji do odejmowania liczb i/lub dat.
W szczególności $subtract może wykonać następujące trzy rzeczy:
- Odejmij dwie liczby, aby zwrócić różnicę
- Odejmij liczbę (w milisekundach) od daty i zwróć wynikową datę
- Odejmij dwie daty, aby zwrócić różnicę w milisekundach
$subtract operator przyjmuje wartości jako argumenty. Argumenty mogą być dowolnymi poprawnymi wyrażeniami, o ile są rozstrzygane na liczby i/lub daty. Aby odjąć liczbę od daty, data musi być pierwszym argumentem.
Przykładowe dane
Załóżmy, że mamy kolekcję o nazwie data z następującym dokumentem:
{
"_id" : 1,
"a" : 20000,
"b" : 250,
"start" : ISODate("2021-01-03T00:00:00Z"),
"end" : ISODate("2021-01-03T23:30:15.100Z")
} Odejmij liczby
Możemy użyć $subtract operator do odjęcia a pole z b pole (lub odwrotnie).
Przykład:
db.data.aggregate(
[
{ $project: {
_id: 0,
a: 1,
b: 1,
result: {
$subtract: [ "$a", "$b" ] } }
}
]
) Wynik:
{ "a" : 20000, "b" : 250, "result" : 19750 } Odejmij liczbę od daty
Jeśli pierwszy argument to data, a drugi to liczba, $subtract operator odejmuje liczbę od daty w milisekundach.
Przykład:
db.data.aggregate(
[
{ $project: {
_id: 0,
b: 1,
start: 1,
result: {
$subtract: [ "$start", "$b" ] } }
}
]
).pretty() Wynik:
{
"b" : 250,
"start" : ISODate("2021-01-03T00:00:00Z"),
"result" : ISODate("2021-01-02T23:59:59.750Z")
} Widzimy, że od daty odjęto 250 milisekund.
Kiedy odejmujemy liczbę od daty, data musi być pierwszym argumentem, a liczba jako drugim argumentem.
Oto, co się stanie, jeśli zamienimy argumenty:
db.data.aggregate(
[
{ $project: {
_id: 0,
b: 1,
start: 1,
result: {
$subtract: [ "$b", "$start" ] } }
}
]
).pretty() Wynik:
uncaught exception: Error: command failed: {
"ok" : 0,
"errmsg" : "cant $subtract adate from a double",
"code" : 16556,
"codeName" : "Location16556"
} : aggregate failed :
example@sqldat.com/mongo/shell/utils.js:25:13
example@sqldat.com/mongo/shell/assert.js:18:14
example@sqldat.com/mongo/shell/assert.js:618:17
example@sqldat.com/mongo/shell/assert.js:708:16
example@sqldat.com/mongo/shell/db.js:266:5
example@sqldat.com/mongo/shell/collection.js:1046:12
@(shell):1:1 Otrzymujemy błąd informujący nas, że nie można odjąć daty od podwojenia.
Zwróć różnicę między dwiema datami
Jeśli oba argumenty są datami, to $subtract operator zwraca różnicę między dwiema datami w milisekundach.
Przykład:
db.data.aggregate(
[
{ $project: {
_id: 0,
start: 1,
end: 1,
result: {
$subtract: [ "$end", "$start" ] } }
}
]
).pretty() Wynik:
{
"start" : ISODate("2021-01-03T00:00:00Z"),
"end" : ISODate("2021-01-03T23:30:15.100Z"),
"result" : NumberLong(84615100)
} Jeśli zmienimy daty, wynik stanie się wartością ujemną:
db.data.aggregate(
[
{ $project: {
_id: 0,
start: 1,
end: 1,
result: {
$subtract: [ "$start", "$end" ] } }
}
]
).pretty() Wynik:
{
"start" : ISODate("2021-01-03T00:00:00Z"),
"end" : ISODate("2021-01-03T23:30:15.100Z"),
"result" : NumberLong(-84615100)
} Przekazywanie niewłaściwej liczby argumentów
$subtract operator akceptuje dokładnie dwa argumenty. Przekazanie niewłaściwej liczby argumentów skutkuje błędem.
Przykład:
db.data.aggregate(
[
{ $project: {
result: {
$subtract: [ "$a" ] } }
}
]
) Wynik:
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 :
example@sqldat.com/mongo/shell/utils.js:25:13
example@sqldat.com/mongo/shell/assert.js:18:14
example@sqldat.com/mongo/shell/assert.js:618:17
example@sqldat.com/mongo/shell/assert.js:708:16
example@sqldat.com/mongo/shell/db.js:266:5
example@sqldat.com/mongo/shell/collection.js:1046:12
@(shell):1:1 Przekazywanie wartości zerowych
Przekazywanie dwóch null wartości dają w wyniku null zostanie zwrócony.
Przykład:
db.data.aggregate(
[
{ $project: {
result: {
$subtract: [ null, null ] } }
}
]
) Wynik:
{ "_id" : 1, "result" : null }