MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

MongoDB $bsonSize

Depuis MongoDB 4.4, vous pouvez utiliser le $bsonSize opérateur de pipeline d'agrégation pour renvoyer la taille d'un document donné en octets.

$bsonSize accepte toute expression valide tant qu'elle se résout soit en objet soit en null .

Exemple

Supposons que nous ayons une collection appelée bars avec le document suivant :

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

Nous pouvons voir que le location champ contient un document. Et les reviews champ contient un tableau de documents.

Utilisons le $bsonSize opérateur pour vérifier la taille de l'location champ :

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

Résultat :

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

Dans ce cas, la taille de l'location le champ est de 61 octets.

Objets dans des tableaux

Voici un exemple d'obtention de la taille d'un document qui est un élément d'un tableau :

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

Résultat :

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

Dans ce cas, nous utilisons $arrayElemAt pour renvoyer l'avis réel, puis à nouveau pour renvoyer la taille de cet avis.

Les tableaux MongoDB sont basés sur zéro, donc l'examen est le premier examen.

Obtenir la taille du document de niveau supérieur

Nous pouvons utiliser le $$ROOT variable système pour faire référence au document de niveau supérieur - ou document racine. Il s'agit du document en cours de traitement par le pipeline.

Par conséquent, nous pouvons passer le $$ROOT variable à $bsonSize pour obtenir la taille de l'ensemble du document en cours de traitement.

Exemple :

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

Résultat :

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

Dans ce cas, le document fait 502 octets.

Types de données incorrects

Comme mentionné, $bsonSize accepte toute expression valide tant qu'elle se résout en un objet ou null .

Voici un exemple de ce qui se passe si vous fournissez une expression qui se résout en un type BSON différent :

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

Résultat :

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

Dans ce cas, nous avons essayé de trouver la taille d'une chaîne, mais ce n'est pas l'un des types de BSON pris en charge, nous obtenons donc une erreur.

Cependant, tout n'est pas perdu. Nous pouvons utiliser $binarySize pour obtenir la taille d'une chaîne.

Obtenir la taille totale de tous les documents d'une collection

Supposons que nous ayons une collection appelée cats avec les documents suivants :

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

Comme indiqué précédemment, nous pouvons utiliser $$ROOT pour renvoyer le document de niveau supérieur en cours de traitement :

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

Résultat :

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

Mais nous pouvons aussi obtenir le total taille de tous les documents de la collection.

Nous pouvons y parvenir comme suit :

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

Résultat :

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

Ici, nous avons regroupé les résultats en utilisant le $group opérateur et en fournissant un _id de null . Nous aurions pu utiliser n'importe quelle autre valeur constante.

Nous avons également utilisé $sum pour calculer les tailles combinées des différents documents.

Nous pouvons voir que la taille totale de tous les documents de la collection est de 294, ce que nous pouvons confirmer en additionnant les résultats de l'exemple précédent.

Méthode Object.bsonSize()

Une autre façon d'obtenir la taille d'un document est d'utiliser le Object.bsonSize() méthode.