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

MongoDB $trunc

V MongoDB, $trunc Operátor agregačního kanálu zkrátí číslo na celé číslo nebo na zadané desetinné místo.

Máte možnost určit, na kolik desetinných míst se má číslo zkrátit. Chcete-li to provést, předejte druhý argument. První argument je číslo, které se má zkrátit, a druhý (nepovinný) argument je počet desetinných míst, na která se má zkrátit.

Vynecháním druhého argumentu se zkrátí všechny číslice napravo od desetinné čárky a vrátí se celá celočíselná hodnota.

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 }

Můžeme použít $trunc operátor pro zkrácení hodnot v data pole:

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

Výsledek:

{ "data" : 8.99, "truncated" : 8 }
{ "data" : 8.45, "truncated" : 8 }
{ "data" : 8.451, "truncated" : 8 }
{ "data" : -8.99, "truncated" : -8 }
{ "data" : -8.45, "truncated" : -8 }
{ "data" : -8.451, "truncated" : -8 }
{ "data" : 8, "truncated" : 8 }
{ "data" : 0, "truncated" : 0 }

Všimněte si, že $trunc nezaokrouhluje čísla jako $round dělá. $trunc operátor jednoduše zkrátí číslo. Pokud bychom použili $round v této kolekci by první a čtvrtý dokument byly zaokrouhleny na 9 a -9 respektive.

Zadejte desetinné místo

Máme možnost použít druhý argument k určení, na kolik desetinných míst se má číslo zkrátit.

Příklad:

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

Výsledek:

{ "data" : 8.99, "truncated" : 8.9 }
{ "data" : 8.45, "truncated" : 8.4 }
{ "data" : 8.451, "truncated" : 8.4 }
{ "data" : -8.99, "truncated" : -8.9 }
{ "data" : -8.45, "truncated" : -8.4 }
{ "data" : -8.451, "truncated" : -8.4 }
{ "data" : 8, "truncated" : 8 }
{ "data" : 0, "truncated" : 0 }

Opět to jednoduše zkrátí číslo. Pokud bychom použili $round , zaokrouhlovalo by to některá z těchto čísel.

Záporná desetinná místa

Druhým argumentem může být jakýkoli platný výraz, který se překládá na celé číslo mezi -20 a 100, s výjimkou. Proto můžete zadat záporné desetinné místo.

Když to uděláte, číslo se ořízne vlevo od desetinného místa. Pokud je absolutní hodnota záporného celého čísla větší než počet číslic nalevo od desetinné čárky, výsledek je 0 .

Předpokládejme, že do naší sbírky přidáme následující dokumenty:

{ "_id" : 9, "data" : 8111.32 }
{ "_id" : 10, "data" : 8514.321 }
{ "_id" : 11, "data" : 8999.454 }

Zde je příklad použití různých záporných desetinných míst při použití $trunc k těm dokumentům:

db.test.aggregate(
   [
     { $match: { _id: { $in: [ 9, 10, 11 ] } } },
     {
       $project:
          {
            _id: 0,
            data: 1,
            a: { $trunc: [ "$data", -1 ] },
            b: { $trunc: [ "$data", -2 ] },
            c: { $trunc: [ "$data", -3 ] },
            d: { $trunc: [ "$data", -4 ] },
            e: { $trunc: [ "$data", -5 ] }
          }
     }
   ]
).pretty()

Výsledek:

{
	"data" : 8111.32,
	"a" : 8110,
	"b" : 8100,
	"c" : 8000,
	"d" : 0,
	"e" : 0
}
{
	"data" : 8514.321,
	"a" : 8510,
	"b" : 8500,
	"c" : 8000,
	"d" : 0,
	"e" : 0
}
{
	"data" : 8999.454,
	"a" : 8990,
	"b" : 8900,
	"c" : 8000,
	"d" : 0,
	"e" : 0
}

Desetinné místo od nuly

Když zadáte desetinné místo 0 , $trunc operátor zkrátí všechny číslice napravo od desetinné čárky a vrátí celou hodnotu celého čísla.

Příklad:

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

Výsledek:

{ "data" : 8.99, "truncated" : 8 }
{ "data" : 8.45, "truncated" : 8 }
{ "data" : 8.451, "truncated" : 8 }
{ "data" : -8.99, "truncated" : -8 }
{ "data" : -8.45, "truncated" : -8 }
{ "data" : -8.451, "truncated" : -8 }
{ "data" : 8, "truncated" : 8 }
{ "data" : 0, "truncated" : 0 }
{ "data" : 8111.32, "truncated" : 8111 }
{ "data" : 8514.321, "truncated" : 8514 }
{ "data" : 8999.454, "truncated" : 8999 }

Typy čísel

Číslo ke zkrácení může být jakýkoli platný výraz, který se překládá na celé číslo, dvojité, desetinné nebo dlouhé číslo. Vrácená hodnota odpovídá datovému typu vstupní hodnoty.

Pokud tedy do naší sbírky přidáme následující dokumenty:

{ "_id" : 12, "data" : NumberDecimal("128.4585") }
{ "_id" : 13, "data" : NumberDecimal("128.12345678912") }

Můžeme použít $trunc na data pole:

db.test.aggregate(
   [
     { $match: { _id: { $in: [ 12, 13 ] } } },
     {
       $project:
          {
            _id: 0,
            data: 1,
            a: { $trunc: [ "$data", -1 ] },
            b: { $trunc: [ "$data", 0 ] },
            c: { $trunc: [ "$data", 3 ] },
            d: { $trunc: [ "$data", 4 ] },
            e: { $trunc: [ "$data", 5 ] }
          }
     }
   ]
).pretty()

Výsledek:

{
	"data" : NumberDecimal("128.4585"),
	"a" : NumberDecimal("1.2E+2"),
	"b" : NumberDecimal("128"),
	"c" : NumberDecimal("128.458"),
	"d" : NumberDecimal("128.4585"),
	"e" : NumberDecimal("128.45850")
}
{
	"data" : NumberDecimal("128.12345678912"),
	"a" : NumberDecimal("1.2E+2"),
	"b" : NumberDecimal("128"),
	"c" : NumberDecimal("128.123"),
	"d" : NumberDecimal("128.1234"),
	"e" : NumberDecimal("128.12345")
}

Zkrácení na nulová desetinná místa

Pokud je druhý argument null , výsledkem je null .

Příklad:

db.test.aggregate(
   [
     { $match: { _id: { $in: [ 1, 2, 3 ] } } },
     {
       $project:
          {
            _id: 0,
            data: 1,
            truncated: { $trunc: [ "$data", null ] }
          }
     }
   ]
)

Výsledek:

{ "data" : 8.99, "truncated" : null }
{ "data" : 8.45, "truncated" : null }
{ "data" : 8.451, "truncated" : null }

Zkrácení hodnoty Null

Pokud je hodnota, která má být zkrácena, null , výsledkem je null .

Předpokládejme, že do sbírky přidáme následující dokument:

{ "_id" : 14, "data" : null }

A my používáme $trunc pro zkrácení hodnoty null:

db.test.aggregate(
   [
     { $match: { _id: { $in: [ 14 ] } } },
     {
       $project:
          {
            _id: 0,
            data: 1,
            truncated: { $trunc: [ "$data", null ] }
          }
     }
   ]
)

Výsledek:

{ "data" : null, "truncated" : null }

Zkrácení nekonečna

Pokud je číslo, které má být zkráceno, Infinity , výsledkem je Infinity . Podobně, pokud je to -Infinity , výsledkem je -Infinity .

Přidejme dva dokumenty s takovými hodnotami:

{ "_id" : 15, "data" : Infinity }
{ "_id" : 16, "data" : -Infinity }

A pojďme je zkrátit:

db.test.aggregate(
   [
     { $match: { _id: { $in: [ 15, 16 ] } } },
     {
       $project:
          {
            _id: 0,
            data: 1,
            truncated: { $trunc: [ "$data", 2 ] }
          }
     }
   ]
)

Výsledek:

{ "data" : Infinity, "truncated" : Infinity }
{ "data" : -Infinity, "truncated" : -Infinity }

Zkrácení NaN

Zkracování NaN výsledkem je NaN .

db.test.aggregate(
   [
     { $match: { _id: { $in: [ 1, 2 ] } } },
     {
       $project:
          {
            _id: 0,
            data: 1,
            truncated: { $trunc: [ "$data" * 2 ] }
          }
     }
   ]
)

Výsledek:

{ "data" : 8.99, "truncated" : NaN }
{ "data" : 8.45, "truncated" : NaN }

Nečíselné typy

Pokud se pokusíte zkrátit hodnotu, která má nesprávný datový typ (tj. není to celé číslo, dvojité, desítkové nebo dlouhé číslo), vrátí se chyba.

Předpokládejme, že do naší sbírky přidáme následující dokument:

{ "_id" : 17, "data" : "Thirty five" }

A nyní se pokusíme zkrátit data pole:

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

Výsledek:

uncaught exception: Error: command failed: {
	"ok" : 0,
	"errmsg" : "$trunc only supports numeric types, not string",
	"code" : 51081,
	"codeName" : "Location51081"
} : aggregate failed :
[email protected]/mongo/shell/utils.js:25:13
[email protected]/mongo/shell/assert.js:18:14
[email protected]/mongo/shell/assert.js:639:17
[email protected]/mongo/shell/assert.js:729:16
[email protected]/mongo/shell/db.js:266:5
[email protected]/mongo/shell/collection.js:1058:12
@(shell):1:1

  1. Jak se připojit k více sbírkám pomocí $lookup v mongodb

  2. Odebrat objekt z vnořeného pole podle více kritérií

  3. Jak spustit server Redis A další aplikaci v Dockeru?

  4. mongodb jak získat maximální hodnotu z kolekcí