MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

MongoDB $sottrai

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 }