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

MongoDB $round vs $trunc:Hvad er forskellen?

MongoDBs aggregeringspipeline-ramme inkluderer en $round operator og en $trunc operatør. Disse operatører udfører lignende, men forskellige opgaver.

Definitioner

Lad os først se på definitionerne af hver operatør:

  • $round operatør runder et tal til et helt heltal eller til en specificeret decimal.
  • $truncate operator trunkerer et tal til et helt heltal eller til en specificeret decimal.

Grundlæggende ligger forskellen i ordene rund vs truncate .

I nogle tilfælde vil begge operatører returnere det samme resultat. I andre tilfælde vil deres resultater afvige. Dette er fordi $round operatør kan runde tallet op, afhængigt af værdien. $truncate operatør runder ikke nummeret. I stedet afkorter den den simpelthen. Med andre ord klipper den simpelthen nummeret som angivet, mens de resterende cifre forbliver som de er.

Eksempel

Antag, at vi har en samling kaldet test med følgende dokumenter:

{ "_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 }

Her er, hvad der sker, når vi anvender $round og $truncate til disse dokumenter:

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, at resultatet i nogle tilfælde er det samme. Hos andre er det anderledes. For eksempel når inputværdien er 0.9 , $round operatør runder tallet op til 1 . $truncate operatør på den anden side fjerner simpelthen .9 del, som producerer resultatet 0 .

Negative fraktionerede steder

Begge operatører accepterer et valgfrit andet argument. Når det er til stede, angiver dette argument antallet af decimaler, der skal afrundes/trunkeres tallet til.

Angivelse af dette andet argument kan yderligere fremhæve forskellen mellem de to operatører.

Eksempel:

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 }

Igen kan vi se, at nogle resultater er identiske, mens andre ikke er det.

Negative fraktionerede steder

Begge operatorer accepterer en negativ værdi for det andet argument.

Eksempel:

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 }

Denne gang er der en skarp kontrast mellem resultaterne produceret af de to operatører. $trunc operatør produceret 0 for hvert dokument, mens $round operatør returnerede forskellige værdier, hvoraf de fleste var rundet op eller ned.

$gulv og $loft

Yderligere to operatører, du skal være opmærksom på, når du udfører operationer som denne, er $floor og $ceil . Disse operatører arbejder på samme måde, men lidt anderledes.

  • $floor returnerer den største heltal mindre end eller lig med det angivne tal
  • $ceil returnerer den mindste heltal større end eller lig med det angivne tal.

  1. Kan ikke finde modulet 'socket.io/node_modules/redis'

  2. Mongoose forbindelse

  3. Spring Data MongoDB – Indekser, annoteringer og konvertere

  4. Sådan indstilles udløb til flere nøgler i Redis