MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

MongoDB $ trunc

Trong MongoDB, $trunc toán tử đường ống tổng hợp cắt bớt một số thành một số nguyên hoặc một chữ số thập phân được chỉ định.

Bạn có tùy chọn chỉ định có bao nhiêu chữ số thập phân để cắt bớt số. Để làm điều này, hãy chuyển đối số thứ hai. Đối số đầu tiên là số cần cắt bớt và đối số thứ hai (tùy chọn) là số vị trí thập phân cần cắt bớt.

Việc bỏ qua đối số thứ hai sẽ cắt bớt tất cả các chữ số ở bên phải của số thập phân và trả về toàn bộ giá trị số nguyên.

Ví dụ

Giả sử chúng ta có một bộ sưu tập được gọi là test với các tài liệu sau:

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

Chúng ta có thể sử dụng $trunc toán tử để cắt ngắn các giá trị trong data lĩnh vực:

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

Kết quả:

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

Lưu ý rằng $trunc không làm tròn số như $round làm. $trunc toán tử chỉ cần cắt bớt số. Nếu chúng tôi đã áp dụng $round đối với bộ sưu tập này, tài liệu đầu tiên và thứ tư sẽ được làm tròn thành 9-9 tương ứng.

Chỉ định một vị trí thập phân

Chúng tôi có tùy chọn sử dụng đối số thứ hai để chỉ định có bao nhiêu chữ số thập phân để cắt bớt số thành.

Ví dụ:

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

Kết quả:

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

Một lần nữa, điều này chỉ đơn giản là cắt bớt số. Nếu chúng tôi đã sử dụng $round , nó sẽ làm tròn một số trong những con số này.

Vị trí thập phân phủ định

Đối số thứ hai có thể là bất kỳ biểu thức hợp lệ nào phân giải thành số nguyên từ -20 đến 100, loại trừ. Do đó, bạn có thể chỉ định một vị trí thập phân âm.

Khi bạn làm điều này, số sẽ bị cắt ngắn ở bên trái của vị trí thập phân. Nếu giá trị tuyệt đối của số nguyên âm lớn hơn số chữ số ở bên trái của số thập phân, thì kết quả là 0 .

Giả sử chúng tôi thêm các tài liệu sau vào bộ sưu tập của mình:

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

Dưới đây là một ví dụ về việc sử dụng các chữ số thập phân âm khác nhau khi áp dụng $trunc đối với các tài liệu đó:

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()

Kết quả:

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

Vị trí thập phân của số 0

Khi bạn cung cấp vị trí thập phân của 0 , $trunc toán tử cắt ngắn tất cả các chữ số ở bên phải của số thập phân và trả về toàn bộ giá trị số nguyên.

Ví dụ:

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

Kết quả:

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

Loại số

Số cần cắt ngắn có thể là bất kỳ biểu thức hợp lệ nào phân giải thành số nguyên, kép, thập phân hoặc dài. Giá trị trả về khớp với kiểu dữ liệu của giá trị đầu vào.

Vì vậy, nếu chúng tôi thêm các tài liệu sau vào bộ sưu tập của mình:

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

Chúng tôi có thể áp dụng $trunc đến dữ liệu data lĩnh vực:

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()

Kết quả:

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

Cắt bớt đến các vị trí thập phân rỗng

Nếu đối số thứ hai là null , kết quả là null .

Ví dụ:

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

Kết quả:

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

Cắt bớt giá trị Null

Nếu giá trị được cắt ngắn là null , kết quả là null .

Giả sử chúng ta thêm tài liệu sau vào bộ sưu tập:

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

Và chúng tôi sử dụng $trunc để cắt bớt giá trị null:

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

Kết quả:

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

Cắt bỏ Infinity

Nếu số được cắt ngắn là Infinity , kết quả là Infinity . Tương tự, nếu nó là -Infinity , kết quả là -Infinity .

Hãy thêm hai tài liệu có các giá trị như vậy:

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

Và hãy cắt ngắn chúng:

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

Kết quả:

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

Cắt bỏ NaN

Cắt bớt NaN kết quả là NaN .

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

Kết quả:

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

Loại không phải số

Nếu bạn cố gắng cắt ngắn một giá trị không đúng kiểu dữ liệu (tức là nó không phải là số nguyên, kép, thập phân hoặc dài), thì sẽ trả về lỗi.

Giả sử chúng ta thêm tài liệu sau vào bộ sưu tập của mình:

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

Và bây giờ chúng tôi cố gắng cắt bớt dữ liệu data lĩnh vực:

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

Kết quả:

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. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Mongodb có thể được sử dụng như một cơ sở dữ liệu nhúng không?

  2. Cách tạo chỉ mục trong MongoDB qua .NET

  3. Quản lý AWS:Cách tiết kiệm 30% chi phí lưu trữ MongoDB của bạn

  4. Hướng dẫn cấu hình bộ cân bằng tải trong cụm phân chia MongoDB

  5. C # - MongoDB - Cập nhật một phần tử bên trong Tài liệu lồng nhau