MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

MongoDB $ soustraire

Dans MongoDB, vous pouvez utiliser le $subtract opérateur de pipeline d'agrégation pour soustraire des nombres et/ou des dates.

Plus précisément, $subtract peut faire les trois choses suivantes :

  • Soustrayez deux nombres pour obtenir la différence
  • Soustraire un nombre (en millisecondes) d'une date et renvoyer la date résultante
  • Soustrayez deux dates pour obtenir la différence en millisecondes

Le $subtract L'opérateur accepte les valeurs comme arguments. Les arguments peuvent être n'importe quelle expression valide tant qu'ils se résolvent en nombres et/ou dates. Pour soustraire un nombre à une date, la date doit être le premier argument..

Exemple de données

Supposons que nous ayons une collection appelée data avec le document suivant :

{ "_id" :1, "a" :20000, "b" :250, "start" :ISODate("2021-01-03T00:00:00Z"), "end" :ISODate("2021- 01-03T23:30:15.100Z")}

Soustraire des nombres

Nous pouvons utiliser le $subtract opérateur pour soustraire le a champ du b domaine (ou inversement).

Exemple :

db.data.aggregate(
   [
     { $project: { 
       _id: 0,
       a: 1, 
       b: 1, 
       result: { 
         $subtract: [ "$a", "$b" ] } } 
         }
   ]
) 

Résultat :

{ "a" :20000, "b" :250, "résultat" :19750 }

Soustraire un nombre d'une date

Si le premier argument est une date et le deuxième argument est un nombre, le $subtract l'opérateur soustrait le nombre de la date en millisecondes.

Exemple :

db.data.aggregate(
   [
     { $project: { 
       _id: 0,
       b: 1, 
       start: 1, 
       result: { 
         $subtract: [ "$start", "$b" ] } } 
         }
   ]
).pretty() 

Résultat :

{ "b" :250, "start" :ISODate("2021-01-03T00:00:00Z"), "result" :ISODate("2021-01-02T23:59:59.750Z")} 

Nous pouvons voir que 250 millisecondes ont été soustraites à la date.

Lorsque nous soustrayons un nombre d'une date, la date doit être le premier argument avec le nombre comme deuxième argument.

Voici ce qui se passe si nous inversons les arguments :

db.data.aggregate(
   [
     { $project: { 
       _id: 0,
       b: 1, 
       start: 1, 
       result: { 
         $subtract: [ "$b", "$start" ] } } 
         }
   ]
).pretty() 

Résultat :

exception non interceptée :erreur :échec de la commande :{ "ok" :0, "errmsg" :"cant $subtract adate from a double", "code" :16556, "codeName" :"Location16556"} :échec de l'agrégat :[email protected]/mongo/shell/utils.js:25:[email protected]/mongo/shell/assert.js:18:[email protected]/mongo/shell/assert.js:618:17example@ sqldat.com/mongo/shell/assert.js:708:[email protected]/mongo/shell/db.js:266:[email protected]/mongo/shell/collection.js:1046:12@(shell ):1:1

Nous obtenons une erreur nous indiquant qu'il ne peut pas soustraire une date d'un double.

Renvoyer la différence entre deux dates

Si les deux arguments sont des dates, alors le $subtract renvoie la différence entre les deux dates en millisecondes.

Exemple :

db.data.aggregate(
   [
     { $project: { 
       _id: 0,
       start: 1, 
       end: 1,
       result: { 
         $subtract: [ "$end", "$start" ] } } 
         }
   ]
).pretty() 

Résultat :

{ "start" :ISODate("2021-01-03T00:00:00Z"), "end" :ISODate("2021-01-03T23:30:15.100Z"), "result" :NumberLong(84615100 )}

Si nous intervertissons les dates, le résultat devient une valeur négative :

db.data.aggregate(
   [
     { $project: { 
       _id: 0,
       start: 1, 
       end: 1,
       result: { 
         $subtract: [ "$start", "$end" ] } } 
         }
   ]
).pretty() 

Résultat :

{ "start" :ISODate("2021-01-03T00:00:00Z"), "end" :ISODate("2021-01-03T23:30:15.100Z"), "result" :NumberLong(- 84615100)}

Passer le mauvais nombre d'arguments

Le $subtract accepte exactement deux arguments. Passer le mauvais nombre d'arguments entraîne une erreur.

Exemple :

db.data.aggregate(
   [
     { $project: { 
       result: { 
         $subtract: [ "$a" ] } } 
         }
   ]
) 

Résultat :

exception non interceptée :erreur :la commande a échoué :{ "ok" :0, "errmsg" :"Invalid $project ::causé par ::L'expression $subtract prend exactement 2 arguments. 1 a été transmis.", "code" :16020, "codeName" :"Location16020"} :l'agrégat a échoué :[email protected]/mongo/shell/utils.js:25:[email protected]/mongo/shell/assert.js:18:14example@sqldat .com/mongo/shell/assert.js:618:[email protected]/mongo/shell/assert.js:708:[email protected]/mongo/shell/db.js:266:[email protected] /mongo/shell/collection.js:1046:12@(shell):1:1

Passer des valeurs nulles

Passer deux null valeurs résultats dans null être retourné.

Exemple :

db.data.aggregate(
   [
     { $project: { 
       result: { 
         $subtract: [ null, null ] } } 
         }
   ]
) 

Résultat :

{ "_id" :1, "result" :null }