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

MongoDB $ bsonSize

Từ MongoDB 4.4, bạn có thể sử dụng $bsonSize toán tử đường ống tổng hợp để trả về kích thước của một tài liệu nhất định tính bằng byte.

$bsonSize chấp nhận bất kỳ biểu thức hợp lệ nào miễn là nó phân giải thành một đối tượng hoặc null .

Ví dụ

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

{
	"_id" : 1,
	"name" : "Boardwalk Social",
	"location" : {
		"type" : "Point",
		"coordinates" : [
			-16.919297718553366,
			145.77675259719823
		]
	},
	"categories" : [
		"Bar",
		"Restaurant",
		"Hotel"
	],
	"reviews" : [
		{
			"name" : "Steve",
			"date" : "20 December, 2020",
			"rating" : 5,
			"comments" : "Great vibe."
		},
		{
			"name" : "Lisa",
			"date" : "25 October, 2020",
			"rating" : 3,
			"comments" : "They just raised their prices :("
		},
		{
			"name" : "Kim",
			"date" : "21 October, 2020",
			"rating" : 4,
			"comments" : "Nice for Friday happy hour"
		}
	]
}

Chúng ta có thể thấy rằng location trường chứa một tài liệu. Và reviews trường chứa một mảng tài liệu.

Hãy sử dụng $bsonSize toán tử để kiểm tra kích thước của location lĩnh vực:

db.bars.aggregate([
  {
    $project: {
      "locationSize": { $bsonSize: "$location" }
    }
  }
])

Kết quả:

{ "_id" : 1, "locationSize" : 61 }

Trong trường hợp này, kích thước của location trường là 61 byte.

Đối tượng trong Mảng

Dưới đây là một ví dụ về cách lấy kích thước của tài liệu là một phần tử của mảng:

db.bars.aggregate([
  {
    $project: {
      "review": { $arrayElemAt: [ "$reviews", 0 ] },
      "reviewSize": { $bsonSize: { $arrayElemAt: [ "$reviews", 0 ] } }
    }
  }
]).pretty()

Kết quả:

{
	"_id" : 1,
	"review" : {
		"name" : "Steve",
		"date" : "20 December, 2020",
		"rating" : 5,
		"comments" : "Great vibe."
	},
	"reviewSize" : 91
}

Trong trường hợp này, chúng tôi sử dụng $arrayElemAt để trả lại bài đánh giá thực tế và sau đó một lần nữa để trả lại kích thước của bài đánh giá đó.

Mảng MongoDB dựa trên số 0, vì vậy bài đánh giá là bài đánh giá đầu tiên.

Lấy kích thước của tài liệu cấp cao nhất

Chúng tôi có thể sử dụng $$ROOT biến hệ thống để tham chiếu đến tài liệu cấp cao nhất - hoặc tài liệu gốc. Đây là tài liệu hiện đang được xử lý bằng đường ống.

Do đó, chúng tôi có thể vượt qua $$ROOT biến thành $bsonSize để có được kích thước của toàn bộ tài liệu hiện đang được xử lý.

Ví dụ:

db.bars.aggregate([
  {
    $project: {
      "rootSize": { $bsonSize: "$$ROOT" }
    }
  }
])

Kết quả:

{ "_id" : 1, "rootSize" : 502 }

Trong trường hợp này, tài liệu có kích thước 502 byte.

Loại dữ liệu sai

Như đã đề cập, $bsonSize chấp nhận bất kỳ biểu thức hợp lệ nào miễn là nó phân giải thành một đối tượng hoặc null .

Dưới đây là một ví dụ về điều gì sẽ xảy ra nếu bạn cung cấp một biểu thức phân giải thành một loại BSON khác:

db.bars.aggregate([
  {
    $project: {
      "nameSize": { $bsonSize: "$name" }
    }
  }
])

Kết quả:

Error: command failed: {
	"ok" : 0,
	"errmsg" : "$bsonSize requires a document input, found: string",
	"code" : 31393,
	"codeName" : "Location31393"
} : aggregate failed :
[email protected]/mongo/shell/utils.js:25:13
[email protected]/mongo/shell/assert.js:18:14
[email protected]/mongo/shell/assert.js:618:17
[email protected]/mongo/shell/assert.js:708:16
[email protected]/mongo/shell/db.js:266:5
[email protected]/mongo/shell/collection.js:1046:12
@(shell):1:1

Trong trường hợp này, chúng tôi đã cố gắng tìm kích thước của một chuỗi, nhưng đó không phải là một trong những loại BSON được hỗ trợ, vì vậy chúng tôi gặp lỗi.

Tuy nhiên, tất cả là không bị mất. Chúng ta có thể sử dụng $binarySize để lấy kích thước của một chuỗi.

Nhận Tổng kích thước của Tất cả Tài liệu trong Bộ sưu tập

Giả sử chúng ta có một bộ sưu tập có tên là cats với các tài liệu sau:

{ "_id" : 1, "name" : "Scratch", "born" : "March, 2020" }
{ "_id" : 2, "name" : "Meow", "weight" : 30 }
{ "_id" : 3, "name" : "Fluffy", "height" : 15 }
{ "_id" : 4, "name" : "Sox", "weight" : 40 }
{ "_id" : 5, "name" : null, "weight" : 20 }
{ "_id" : 6, "height" : 20, "born" : ISODate("2021-01-03T23:30:15.123Z") }

Như đã trình bày trước đó, chúng tôi có thể sử dụng $$ROOT để trả lại tài liệu cấp cao nhất hiện đang được xử lý:

db.cats.aggregate([
  {
    $project: {
      "rootSize": { $bsonSize: "$$ROOT" }
    }
  }
])

Kết quả:

{ "_id" : 1, "rootSize" : 58 }
{ "_id" : 2, "rootSize" : 49 }
{ "_id" : 3, "rootSize" : 51 }
{ "_id" : 4, "rootSize" : 48 }
{ "_id" : 5, "rootSize" : 40 }
{ "_id" : 6, "rootSize" : 48 }

Nhưng chúng tôi cũng có thể nhận được tổng số kích thước của tất cả các tài liệu trong bộ sưu tập.

Chúng ta có thể đạt được điều này như sau:

db.cats.aggregate([
  {
    $group: {
      "_id": null,
      "rootSize": { $sum: { $bsonSize: "$$ROOT" } }
    }
  }
])

Kết quả:

{ "_id" : null, "rootSize" : 294 }

Ở đây, chúng tôi đã nhóm các kết quả bằng cách sử dụng $group nhà điều hành và cung cấp _id trong tổng số null . Chúng tôi có thể đã sử dụng bất kỳ giá trị không đổi nào khác.

Chúng tôi cũng đã sử dụng $sum để tính toán kích thước kết hợp của các tài liệu khác nhau.

Chúng tôi có thể thấy rằng tổng kích thước của tất cả các tài liệu trong bộ sưu tập là 294, chúng tôi có thể xác nhận kích thước này bằng cách cộng các kết quả trong ví dụ trước.

Phương thức Object.bsonSize ()

Một cách khác để lấy kích thước của tài liệu là sử dụng Object.bsonSize() phương pháp.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB-as-a-Service trong Tài khoản Amazon AWS của Chính bạn

  2. MongoDb - Thay đổi kiểu từ Int thành Double

  3. Sắp xếp phân biệt chữ hoa chữ thường trong MongoDB

  4. Xoay các hàng thành các cột trong MongoDB

  5. MongoDB mongorestore và bộ sưu tập hiện có với các bản ghi