In MongoDB, puoi usare $subtract
operatore della pipeline di aggregazione per sottrarre numeri e/o date.
In particolare, $subtract
può fare le seguenti tre cose:
- Sottrai due numeri per restituire la differenza
- Sottrai un numero (in millisecondi) da una data e restituisci la data risultante
- Sottrai due date per restituire la differenza in millisecondi
Il $subtract
l'operatore accetta i valori come argomenti. Gli argomenti possono essere qualsiasi espressione valida purché si risolvano in numeri e/o date. Per sottrarre un numero da una data, la data deve essere il primo argomento..
Dati di esempio
Supponiamo di avere una raccolta chiamata data
con il seguente documento:
{ "_id" : 1, "a" : 20000, "b" : 250, "start" : ISODate("2021-01-03T00:00:00Z"), "end" : ISODate("2021-01-03T23:30:15.100Z") }
Sottrai numeri
Possiamo usare il $subtract
operatore per sottrarre a
campo dal b
campo (o viceversa).
Esempio:
db.data.aggregate(
[
{ $project: {
_id: 0,
a: 1,
b: 1,
result: {
$subtract: [ "$a", "$b" ] } }
}
]
)
Risultato:
{ "a" : 20000, "b" : 250, "result" : 19750 }
Sottrai un numero da una data
Se il primo argomento è una data e il secondo argomento è un numero, il $subtract
l'operatore sottrae il numero dalla data in millisecondi.
Esempio:
db.data.aggregate(
[
{ $project: {
_id: 0,
b: 1,
start: 1,
result: {
$subtract: [ "$start", "$b" ] } }
}
]
).pretty()
Risultato:
{ "b" : 250, "start" : ISODate("2021-01-03T00:00:00Z"), "result" : ISODate("2021-01-02T23:59:59.750Z") }
Possiamo vedere che sono stati sottratti 250 millisecondi dalla data.
Quando sottraiamo un numero da una data, la data deve essere il primo argomento con il numero come secondo argomento.
Ecco cosa succede se cambiamo argomento:
db.data.aggregate(
[
{ $project: {
_id: 0,
b: 1,
start: 1,
result: {
$subtract: [ "$b", "$start" ] } }
}
]
).pretty()
Risultato:
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
Riceviamo un errore che ci dice che non può sottrarre una data da un doppio.
Restituisci la differenza tra due date
Se entrambi gli argomenti sono date, allora $subtract
l'operatore restituisce la differenza tra le due date in millisecondi.
Esempio:
db.data.aggregate(
[
{ $project: {
_id: 0,
start: 1,
end: 1,
result: {
$subtract: [ "$end", "$start" ] } }
}
]
).pretty()
Risultato:
{ "start" : ISODate("2021-01-03T00:00:00Z"), "end" : ISODate("2021-01-03T23:30:15.100Z"), "result" : NumberLong(84615100) }
Se cambiamo le date, il risultato diventa un valore negativo:
db.data.aggregate(
[
{ $project: {
_id: 0,
start: 1,
end: 1,
result: {
$subtract: [ "$start", "$end" ] } }
}
]
).pretty()
Risultato:
{ "start" : ISODate("2021-01-03T00:00:00Z"), "end" : ISODate("2021-01-03T23:30:15.100Z"), "result" : NumberLong(-84615100) }
Passare il numero sbagliato di argomenti
Il $subtract
operatore accetta esattamente due argomenti. Il passaggio di un numero errato di argomenti genera un errore.
Esempio:
db.data.aggregate(
[
{ $project: {
result: {
$subtract: [ "$a" ] } }
}
]
)
Risultato:
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
Passo di valori nulli
Superamento di due null
valori risulta null
in fase di restituzione.
Esempio:
db.data.aggregate(
[
{ $project: {
result: {
$subtract: [ null, null ] } }
}
]
)
Risultato:
{ "_id" : 1, "result" : null }