sql >> Databasteknik >  >> NoSQL >> MongoDB

MongoDB $round vs $trunc:Vad är skillnaden?

MongoDB:s aggregeringspipeline-ramverk inkluderar en $round operator och en $trunc operatör. Dessa operatörer utför liknande men olika uppgifter.

Definitioner

Låt oss först titta på definitionerna för varje operatör:

  • $round operatör rundor ett tal till ett heltal eller till en angiven decimal.
  • $truncate operatorn trunkerar ett tal till ett heltal eller till en angiven decimal.

I grund och botten ligger skillnaden i orden runda kontra truncate .

I vissa fall kommer båda operatörerna att returnera samma resultat. I andra fall kommer deras resultat att skilja sig åt. Detta beror på att $round operatören kan avrunda siffran uppåt, beroende på värdet. $truncate operatören rundar inte av numret. Istället avkortar den den helt enkelt. Med andra ord, det klipper helt enkelt numret som specificerat, medan de återstående siffrorna lämnas som de är.

Exempel

Anta att vi har en samling som heter test med följande dokument:

{ "_id" : 1, "data" : 8.99 }
{ "_id" : 2, "data" : 8.45 }
{ "_id" : 3, "data" : 8.451 }
{ "_id" : 4, "data" : -8.99 }
{ "_id" : 5, "data" : -8.45 }
{ "_id" : 6, "data" : -8.451 }
{ "_id" : 7, "data" : 8 }
{ "_id" : 8, "data" : 0 }
{ "_id" : 9, "data" : 0.5 }
{ "_id" : 10, "data" : 8111.32 }
{ "_id" : 11, "data" : 8514.321 }
{ "_id" : 12, "data" : 8999.454 }

Det här är vad som händer när vi använder $round och $truncate till dessa dokument:

db.test.aggregate(
   [
     {
       $project:
          {
            _id: 0,
            data: 1,
            rounded: { $round: [ "$data" ] },
            truncated: { $trunc: [ "$data" ] }
          }
     }
   ]
)

Resultat:

{ "data" : 0, "rounded" : 0, "truncated" : 0 }
{ "data" : 8, "rounded" : 8, "truncated" : 8 }
{ "data" : 0.5, "rounded" : 0, "truncated" : 0 }
{ "data" : 0.9, "rounded" : 1, "truncated" : 0 }
{ "data" : 8.99, "rounded" : 9, "truncated" : 8 }
{ "data" : 8.45, "rounded" : 8, "truncated" : 8 }
{ "data" : 8.451, "rounded" : 8, "truncated" : 8 }
{ "data" : -8.99, "rounded" : -9, "truncated" : -8 }
{ "data" : -8.45, "rounded" : -8, "truncated" : -8 }
{ "data" : -8.451, "rounded" : -8, "truncated" : -8 }

Vi kan se att i vissa fall blir resultatet detsamma. I andra är det annorlunda. Till exempel när inmatningsvärdet är 0.9 , $round operatören avrundar talet uppåt till 1 . $truncate operatorn å andra sidan tar helt enkelt bort .9 del, som ger resultatet 0 .

Negativa bråkdelar

Båda operatörerna accepterar ett valfritt andra argument. När det finns, anger detta argument antalet decimaler att avrunda/trunkera talet till.

Att tillhandahålla detta andra argument kan ytterligare markera skillnaden mellan de två operatorerna.

Exempel:

db.test.aggregate(
   [
     {
       $project:
          {
            _id: 0,
            data: 1,
            rounded: { $round: [ "$data", 1 ] },
            truncated: { $trunc: [ "$data", 1 ] }
          }
     }
   ]
)

Resultat:

{ "data" : 0, "rounded" : 0, "truncated" : 0 }
{ "data" : 8, "rounded" : 8, "truncated" : 8 }
{ "data" : 0.5, "rounded" : 0.5, "truncated" : 0.5 }
{ "data" : 0.9, "rounded" : 0.9, "truncated" : 0.9 }
{ "data" : 8.99, "rounded" : 9, "truncated" : 8.9 }
{ "data" : 8.45, "rounded" : 8.4, "truncated" : 8.4 }
{ "data" : 8.451, "rounded" : 8.5, "truncated" : 8.4 }
{ "data" : -8.99, "rounded" : -9, "truncated" : -8.9 }
{ "data" : -8.45, "rounded" : -8.4, "truncated" : -8.4 }
{ "data" : -8.451, "rounded" : -8.5, "truncated" : -8.4 }

Återigen kan vi se att vissa resultat är identiska medan andra inte är det.

Negativa bråkdelar

Båda operatorerna accepterar ett negativt värde för det andra argumentet.

Exempel:

db.test.aggregate(
   [
     {
       $project:
          {
            _id: 0,
            data: 1,
            rounded: { $round: [ "$data", -1 ] },
            truncated: { $trunc: [ "$data", -1 ] }
          }
     }
   ]
)

Resultat:

{ "data" : 0, "rounded" : 0, "truncated" : 0 }
{ "data" : 8, "rounded" : 10, "truncated" : 0 }
{ "data" : 0.5, "rounded" : 0, "truncated" : 0 }
{ "data" : 0.9, "rounded" : 0, "truncated" : 0 }
{ "data" : 8.99, "rounded" : 10, "truncated" : 0 }
{ "data" : 8.45, "rounded" : 10, "truncated" : 0 }
{ "data" : 8.451, "rounded" : 10, "truncated" : 0 }
{ "data" : -8.99, "rounded" : -10, "truncated" : 0 }
{ "data" : -8.45, "rounded" : -10, "truncated" : 0 }
{ "data" : -8.451, "rounded" : -10, "truncated" : 0 }

Den här gången finns det en skarp kontrast mellan resultaten som produceras av de två operatörerna. $trunc operatören producerade 0 för varje dokument, medan $round operatören returnerade olika värden, varav de flesta var avrundade uppåt eller nedåt.

$golv och $tak

Ytterligare två operatörer att vara medveten om när du utför operationer som denna är $floor och $ceil . Dessa operatörer fungerar på ett liknande sätt, men något annorlunda.

  • $floor returnerar den största heltal mindre än eller lika med det angivna talet
  • $ceil returnerar den minsta heltal större än eller lika med det angivna talet.

  1. Validerar lösenord / bekräfta lösenord med Mongoose-schema

  2. Garanterar MongoDB journalföring hållbarhet?

  3. MongoDB atomic findOrCreate:findOne, infoga om det inte finns, men uppdatera inte

  4. varför minskar inte redis-minnesanvändningen när halvan av nycklar