sql >> Databáze >  >> NoSQL >> MongoDB

MongoDB $round vs $trunc:Jaký je rozdíl?

Rámec agregačního kanálu MongoDB obsahuje $round operátor a $trunc operátor. Tito operátoři vykonávají podobné, ale odlišné úkoly.

Definice

Nejprve se podívejme na definice jednotlivých operátorů:

  • $round operátor koly číslo na celé celé číslo nebo na zadané desetinné místo.
  • $truncate operátor zkrátí číslo na celé celé číslo nebo na zadané desetinné místo.

V podstatě je rozdíl ve slovech kulatý vs zkrátit .

V některých případech oba operátoři vrátí stejný výsledek. V ostatních případech se jejich výsledky budou lišit. Je to proto, že $round operátor může zaokrouhlit číslo nahoru v závislosti na hodnotě. $truncate operátor číslo nezaokrouhluje. Místo toho jej jednoduše zkrátí. Jinými slovy, jednoduše ořízne číslo, jak je zadáno, a zbývající číslice ponechá tak, jak jsou.

Příklad

Předpokládejme, že máme kolekci nazvanou test s následujícími dokumenty:

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

Zde je to, co se stane, když použijeme $round a $truncate k těm dokumentům:

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

Výsledek:

{ "data" :0, "zaokrouhleno" :0, "zkráceno" :0 }{ "data" :8, "zaokrouhleno" :8, "zkráceno" :8 }{ "data" :0,5, "zaokrouhleno" " :0, "zkráceno" :0 }{ "data" :0,9, "zaokrouhleno" :1, "zkráceno" :0 }{ "data" :8,99, "zaokrouhleno" :9, "zkráceno" :8 }{ " data" :8,45, "zaokrouhleno" :8, "zkráceno" :8 }{ "data" :8,451, "zaokrouhleno" :8, "zkráceno" :8 }{ "data" :-8,99, "zaokrouhleno" :-9 , "zkráceno" :-8 }{ "data" :-8,45, "zaokrouhleno" :-8, "zkráceno" :-8 }{ "data" :-8,451, "zaokrouhleno" :-8, "zkráceno" :- 8 }

Vidíme, že v některých případech je výsledek stejný. V jiných je to jinak. Například, když je vstupní hodnota 0.9 , $round operátor zaokrouhlí číslo nahoru na 1 . $truncate operátor na druhé straně jednoduše odstraní .9 část, která vytváří výsledek 0 .

Místa se zápornými zlomky

Oba operátory přijímají volitelný druhý argument. Je-li přítomen, tento argument určuje počet desetinných míst, na která se má číslo zaokrouhlit/zkrátit.

Uvedení tohoto druhého argumentu může dále zvýraznit rozdíl mezi těmito dvěma operátory.

Příklad:

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

Výsledek:

{ "data" :0, "zaokrouhleno" :0, "zkráceno" :0 }{ "data" :8, "zaokrouhleno" :8, "zkráceno" :8 }{ "data" :0,5, "zaokrouhleno" " :0,5, "zkráceno" :0,5 }{ "data" :0,9, "zaokrouhleno" :0,9, "zkráceno" :0,9 }{ "data" :8,99, "zaokrouhleno" :9, "zkráceno" :8,9 }{ " data" :8,45, "zaokrouhleno" :8,4, "zkráceno" :8,4 }{ "data" :8,451, "zaokrouhleno" :8,5, "zkráceno" :8,4 }{ "data" :-8,99, "zaokrouhleno" :-9 , "zkráceno" :-8,9 }{ "data" :-8,45, "zaokrouhleno" :-8,4, "zkráceno" :-8,4 }{ "data" :-8,451, "zaokrouhleno" :-8,5, "zkráceno" :- 8.4 }

Opět můžeme vidět, že některé výsledky jsou identické, zatímco jiné ne.

Místa se zápornými zlomky

Oba operátory přijímají zápornou hodnotu pro druhý argument.

Příklad:

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

Výsledek:

{ "data" :0, "zaokrouhleno" :0, "zkráceno" :0 }{ "data" :8, "zaokrouhleno" :10, "zkráceno" :0 }{ "data" :0,5, "zaokrouhleno" " :0, "zkráceno" :0 }{ "data" :0,9, "zaokrouhleno" :0, "zkráceno" :0 }{ "data" :8,99, "zaokrouhleno" :10, "zkráceno" :0 }{ " data" :8,45, "zaokrouhleno" :10, "zkráceno" :0 }{ "data" :8,451, "zaokrouhleno" :10, "zkráceno" :0 }{ "data" :-8,99, "zaokrouhleno" :-10 , "zkráceno" :0 }{ "data" :-8,45, "zaokrouhleno" :-10, "zkráceno" :0 }{ "data" :-8,451, "zaokrouhleno" :-10, "zkráceno" :0 } 

Tentokrát je mezi výsledky dosaženými těmito dvěma operátory ostrý kontrast. $trunc operátor vytvořil 0 pro každý dokument, zatímco $round operátor vrátil různé hodnoty, z nichž většina byla zaokrouhlena nahoru nebo dolů.

$floor a $ceil

Další dva operátoři, na které je třeba dávat pozor při provádění operací, jako je tato, jsou $floor a $ceil . Tito operátoři pracují podobným způsobem, ale mírně odlišným způsobem.

  • $floor vrátí největší celé číslo menší nebo rovno zadanému číslu
  • $ceil vrátí nejmenší celé číslo větší nebo rovné zadanému číslu.

  1. Chyba při připojování k serveru MongoDb Atlas Server

  2. Agregační dotaz MongoDB pomocí ovladače PHP

  3. Meteor:nahrávání souboru z klienta do kolekce Mongo vs souborový systém vs GridFS

  4. Jak atomicky odstranit klíče odpovídající vzoru pomocí Redis