sql >> Databasteknik >  >> NoSQL >> MongoDB

MongoDB $bsonSize

Från MongoDB 4.4 kan du använda $bsonSize aggregeringspipeline-operatör för att returnera storleken på ett givet dokument i byte.

$bsonSize accepterar vilket giltigt uttryck som helst så länge det löser sig till antingen ett objekt eller null .

Exempel

Anta att vi har en samling som heter bars med följande dokument:

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

Vi kan se att location fältet innehåller ett dokument. Och reviews fältet innehåller en mängd dokument.

Låt oss använda $bsonSize operatör för att kontrollera storleken på location fält:

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

Resultat:

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

I det här fallet storleken på location fältet är 61 byte.

Objekt i arrayer

Här är ett exempel på att få storleken på ett dokument som är ett element i en array:

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

Resultat:

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

I det här fallet använder vi $arrayElemAt för att returnera den faktiska recensionen och sedan igen för att returnera storleken på den recensionen.

MongoDB-matriser är nollbaserade, så granskningen är den första recensionen.

Hämta storleken på dokumentet på toppnivå

Vi kan använda $$ROOT systemvariabel för att referera till dokumentet på toppnivån – eller rotdokumentet. Det här är dokumentet som för närvarande bearbetas av pipeline.

Därför kan vi skicka $$ROOT variabel till $bsonSize för att få storleken på hela dokumentet som för närvarande bearbetas.

Exempel:

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

Resultat:

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

I det här fallet är dokumentet 502 byte.

Fel datatyper

Som nämnts, $bsonSize accepterar alla giltiga uttryck så länge det löser sig till ett objekt eller null .

Här är ett exempel på vad som händer om du tillhandahåller ett uttryck som löser sig till en annan BSON-typ:

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

Resultat:

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

I det här fallet försökte vi hitta storleken på en sträng, men det är inte en av de BSON-typer som stöds, så vi får ett felmeddelande.

Allt är dock inte förlorat. Vi kan använda $binarySize för att få storleken på en sträng.

Få den totala storleken på alla dokument i en samling

Anta att vi har en samling som heter cats med följande dokument:

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

Som tidigare visats kan vi använda $$ROOT för att returnera toppnivådokumentet som för närvarande bearbetas:

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

Resultat:

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

Men vi kan också få totalt storleken på alla dokument i samlingen.

Vi kan uppnå detta enligt följande:

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

Resultat:

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

Här grupperade vi resultaten med $group operatör och tillhandahåller ett _id av null . Vi kunde ha använt vilket annat konstant värde som helst.

Vi använde också $sum för att beräkna de kombinerade storlekarna på de olika dokumenten.

Vi kan se att den totala storleken på alla dokument i samlingen är 294, vilket vi kan bekräfta genom att lägga ihop resultaten i föregående exempel.

Object.bsonSize() Metod

Ett annat sätt att få ett dokuments storlek är att använda Object.bsonSize() metod.


  1. Behöver råd för att designa databas i mongodb med mongoose

  2. Hur kan jag lösenordsskydda min /sidekiq-rutt (dvs. kräver autentisering för Sidekiq::Web-verktyget)?

  3. Förstå hållbarhet och skrivsäkerhet i MongoDB

  4. Gruppera efter datum med lokal tidszon i MongoDB