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

MongoDB $ trække fra

I MongoDB kan du bruge $subtract aggregeringsrørledningsoperatør for at trække tal og/eller datoer fra.

Specifikt $subtract kan gøre følgende tre ting:

  • Træk to tal fra for at returnere forskellen
  • Træk et tal (i millisekunder) fra en dato og returner den resulterende dato
  • Træk to datoer fra for at returnere forskellen i millisekunder

$subtract operatoren accepterer værdierne som argumenter. Argumenterne kan være et hvilket som helst gyldigt udtryk, så længe de løses til tal og/eller datoer. For at trække et tal fra en dato, skal datoen være det første argument...

Eksempel på data

Antag, at vi har en samling kaldet data med følgende dokument:

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

Træk tal fra

Vi kan bruge $subtract operatør for at trække a fra feltet fra b felt (eller omvendt).

Eksempel:

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

Resultat:

{ "a" : 20000, "b" : 250, "result" : 19750 }

Træk et tal fra en dato

Hvis det første argument er en dato, og det andet argument er et tal, er $subtract operator trækker tallet fra datoen i millisekunder.

Eksempel:

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

Resultat:

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

Vi kan se, at 250 millisekunder er blevet trukket fra datoen.

Når vi trækker et tal fra en dato, skal datoen være det første argument med tallet som det andet argument.

Her er, hvad der sker, hvis vi skifter argumenterne rundt:

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

Resultat:

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

Vi får en fejl, der fortæller os, at den ikke kan trække en dato fra en dobbelt.

Tilbagefør forskellen mellem to datoer

Hvis begge argumenter er datoer, så $subtract operator returnerer forskellen mellem de to datoer i millisekunder.

Eksempel:

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

Resultat:

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

Hvis vi skifter datoerne, bliver resultatet en negativ værdi:

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

Resultat:

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

Bestå det forkerte antal argumenter

$subtract operatør accepterer præcis to argumenter. Sender det forkerte antal argumenter, resulterer det i en fejl.

Eksempel:

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

Resultat:

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

Bestå nulværdier

Sender to null værdier resulterer i null bliver returneret.

Eksempel:

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

Resultat:

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

  1. Hvordan opdaterer jeg delvist et objekt i MongoDB, så det nye objekt vil overlejre / flette med det eksisterende

  2. MongoDB $isoWeekYear

  3. Hvorfor har vi brug for en 'arbiter' i MongoDB-replikering?

  4. Range Querying i Redis - Spring Data Redis