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

MongoDB $bsonSize

Od MongoDB 4.4 můžete použít $bsonSize operátor agregačního kanálu, který vrátí velikost daného dokumentu v bajtech.

$bsonSize přijímá jakýkoli platný výraz, pokud se rozlišuje buď na objekt, nebo na null .

Příklad

Předpokládejme, že máme kolekci nazvanou bars s následujícím dokumentem:

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

Vidíme, že location pole obsahuje dokument. A reviews pole obsahuje pole dokumentů.

Použijme $bsonSize operátor pro kontrolu velikosti location pole:

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

Výsledek:

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

V tomto případě velikost location pole je 61 bajtů.

Objekty v polích

Zde je příklad získání velikosti dokumentu, který je prvkem pole:

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

Výsledek:

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

V tomto případě používáme $arrayElemAt pro vrácení aktuální recenze a poté znovu pro vrácení velikosti této recenze.

Pole MongoDB jsou založeny na nule, takže recenze je první recenzí.

Získejte velikost dokumentu nejvyšší úrovně

Můžeme použít $$ROOT systémová proměnná odkazující na dokument nejvyšší úrovně – nebo kořenový dokument. Toto je dokument, který právě zpracovává kanál.

Proto můžeme předat $$ROOT proměnná na $bsonSize získat velikost celého dokumentu, který se právě zpracovává.

Příklad:

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

Výsledek:

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

V tomto případě má dokument 502 bajtů.

Chybné datové typy

Jak již bylo zmíněno, $bsonSize přijímá jakýkoli platný výraz, pokud se vyhodnotí jako objekt nebo null .

Zde je příklad toho, co se stane, když zadáte výraz, který se převede na jiný typ BSON:

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

Výsledek:

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

V tomto případě jsme se pokusili najít velikost řetězce, ale to není jeden z podporovaných typů BSON, takže se zobrazí chyba.

Není však vše ztraceno. Můžeme použít $binarySize získat velikost řetězce.

Získejte celkovou velikost všech dokumentů ve sbírce

Předpokládejme, že máme sbírku nazvanou cats s následujícími dokumenty:

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

Jak bylo uvedeno výše, můžeme použít $$ROOT pro vrácení aktuálně zpracovávaného dokumentu nejvyšší úrovně:

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

Výsledek:

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

Můžeme ale také získat celkem velikost všech dokumentů ve sbírce.

Toho můžeme dosáhnout následovně:

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

Výsledek:

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

Zde jsme výsledky seskupili pomocí $group operátor a poskytnutí _id z null . Mohli jsme použít jakoukoli jinou konstantní hodnotu.

Také jsme použili $sum pro výpočet kombinovaných velikostí různých dokumentů.

Vidíme, že celková velikost všech dokumentů ve sbírce je 294, což můžeme potvrdit sečtením výsledků v předchozím příkladu.

Metoda Object.bsonSize()

Dalším způsobem, jak získat velikost dokumentu, je použít Object.bsonSize() metoda.


  1. časový limit připojení redis ke vzdálenému serveru v dockeru

  2. Jak povolit data JSON ve volném formátu v dokumentech Mongoose?

  3. MongoDB vyhledávání, když cizí pole je pole objektů

  4. Jak vrátit pouze hodnotu pole v mongodb