MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

MongoDB $bsonSize

Ab MongoDB 4.4 können Sie $bsonSize verwenden Aggregations-Pipeline-Operator, um die Größe eines bestimmten Dokuments in Byte zurückzugeben.

$bsonSize akzeptiert jeden gültigen Ausdruck, solange er entweder in ein Objekt oder null aufgelöst wird .

Beispiel

Angenommen, wir haben eine Sammlung namens bars mit folgendem 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"
		}
	]
}

Wir können sehen, dass der location Feld enthält ein Dokument. Und die reviews Feld enthält ein Array von Dokumenten.

Lassen Sie uns die $bsonSize verwenden Operator, um die Größe der location zu prüfen Feld:

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

Ergebnis:

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

In diesem Fall die Größe von location Feld ist 61 Bytes groß.

Objekte in Arrays

Hier ist ein Beispiel für das Ermitteln der Größe eines Dokuments, das ein Element eines Arrays ist:

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

Ergebnis:

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

In diesem Fall verwenden wir $arrayElemAt um die eigentliche Bewertung zurückzugeben, und dann noch einmal, um die Größe dieser Bewertung zurückzugeben.

MongoDB-Arrays sind nullbasiert, daher ist die Überprüfung die erste Überprüfung.

Ermitteln Sie die Größe des Dokuments der obersten Ebene

Wir können den $$ROOT verwenden Systemvariable, um auf das Dokument der obersten Ebene – oder das Stammdokument – ​​zu verweisen. Dies ist das Dokument, das derzeit von der Pipeline verarbeitet wird.

Daher können wir den $$ROOT übergeben Variable zu $bsonSize um die Größe des gesamten Dokuments zu erhalten, das gerade verarbeitet wird.

Beispiel:

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

Ergebnis:

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

In diesem Fall ist das Dokument 502 Byte groß.

Falsche Datentypen

Wie bereits erwähnt, $bsonSize akzeptiert jeden gültigen Ausdruck, solange er in ein Objekt oder null aufgelöst wird .

Hier ist ein Beispiel dafür, was passiert, wenn Sie einen Ausdruck angeben, der in einen anderen BSON-Typ aufgelöst wird:

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

Ergebnis:

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

In diesem Fall haben wir versucht, die Größe einer Zeichenfolge zu finden, aber das ist keiner der unterstützten BSON-Typen, daher erhalten wir eine Fehlermeldung.

Es ist jedoch nicht alles verloren. Wir können $binarySize verwenden um die Größe eines Strings zu erhalten.

Ermitteln Sie die Gesamtgröße aller Dokumente in einer Sammlung

Angenommen, wir haben eine Sammlung namens cats mit folgenden Dokumenten:

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

Wie zuvor gezeigt, können wir $$ROOT verwenden um das aktuell verarbeitete Dokument der obersten Ebene zurückzugeben:

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

Ergebnis:

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

Aber wir können auch die Gesamtsumme erhalten Größe aller Dokumente in der Sammlung.

Wir können dies wie folgt erreichen:

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

Ergebnis:

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

Hier haben wir die Ergebnisse mithilfe von $group gruppiert -Operator und Bereitstellen einer _id von null . Wir hätten jeden anderen konstanten Wert verwenden können.

Wir haben auch $sum verwendet um die kombinierten Größen der verschiedenen Dokumente zu berechnen.

Wir können sehen, dass die Gesamtgröße aller Dokumente in der Sammlung 294 beträgt, was wir bestätigen können, indem wir die Ergebnisse im vorherigen Beispiel addieren.

Object.bsonSize()-Methode

Eine andere Möglichkeit, die Größe eines Dokuments zu erhalten, ist die Verwendung von Object.bsonSize() Methode.