sql >> Database >  >> NoSQL >> MongoDB

MongoDB $aftrekken

In MongoDB kunt u de $subtract . gebruiken aggregatiepijplijnoperator om getallen en/of datums af te trekken.

In het bijzonder, $subtract kan de volgende drie dingen doen:

  • Trek twee getallen af ​​om het verschil terug te krijgen
  • Trek een getal (in milliseconden) af van een datum en retourneer de resulterende datum
  • Trek twee datums af om het verschil in milliseconden terug te geven

De $subtract operator accepteert de waarden als argumenten. De argumenten kunnen elke geldige uitdrukking zijn, zolang ze maar worden omgezet in getallen en/of datums. Om een ​​getal van een datum af te trekken, moet de datum het eerste argument zijn.

Voorbeeldgegevens

Stel dat we een verzameling hebben met de naam data met het volgende document:

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

Getallen aftrekken

We kunnen de $subtract . gebruiken operator om de a . af te trekken veld uit de b veld (of omgekeerd).

Voorbeeld:

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

Resultaat:

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

Een getal aftrekken van een datum

Als het eerste argument een datum is en het tweede argument een getal is, wordt de $subtract operator trekt het getal in milliseconden van de datum af.

Voorbeeld:

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

Resultaat:

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

We kunnen zien dat er 250 milliseconden van de datum zijn afgetrokken.

Wanneer we een getal van een datum aftrekken, moet de datum het eerste argument zijn met het getal als het tweede argument.

Dit is wat er gebeurt als we de argumenten omdraaien:

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

Resultaat:

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

We krijgen een foutmelding die ons vertelt dat het geen datum kan aftrekken van een dubbel.

Geef het verschil tussen twee datums terug

Als beide argumenten datums zijn, dan is de $subtract operator retourneert het verschil tussen de twee datums in milliseconden.

Voorbeeld:

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

Resultaat:

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

Als we de datums omdraaien, wordt het resultaat een negatieve waarde:

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

Resultaat:

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

Het verkeerde aantal argumenten doorgeven

De $subtract operator accepteert precies twee argumenten. Het doorgeven van het verkeerde aantal argumenten resulteert in een fout.

Voorbeeld:

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

Resultaat:

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

Nulwaarden doorgeven

Twee null . doorgeven waarden resulteert in null wordt geretourneerd.

Voorbeeld:

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

Resultaat:

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

  1. HBase-prestaties CDH5 (HBase1) versus CDH6 (HBase2)

  2. Hoe kan ik de tijd van de dag opslaan in MongoDB? Als een string? Geef willekeurig jaar/maand/dag?

  3. mongodb.conf bind_ip =127.0.0.1 werkt niet maar 0.0.0.0 werkt

  4. MongoDB $ voorbeeld