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:1Nous 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:1Passer des valeurs nulles
Passer deux
null
valeurs résultats dansnull
être retourné.Exemple :
db.data.aggregate( [ { $project: { result: { $subtract: [ null, null ] } } } ] )
Résultat :
{ "_id" :1, "result" :null }