web-dev-qa-db-fra.com

Mongo = obtenir la taille d'un document unique

J'ai rencontré un comportement étrange de mongo et je voudrais clarifier un peu ...
Ma demande est aussi simple que cela: je voudrais obtenir une taille de document unique en collection. J'ai trouvé deux solutions possibles:

  • Object.bsonsize - une méthode javascript qui devrait renvoyer une taille en octets
  • db.collection.stats () - où il existe une ligne 'avgObjSize' qui produit une vue de taille "agrégée" (moyenne) sur les données. Il représente simplement la taille moyenne d'un document unique.

  • Lorsque je crée une collection de tests avec un seul document, les deux fonctions renvoient des valeurs différentes. Comment est-ce possible?
    Existe-t-il une autre méthode pour obtenir la taille d’un document mongo?

Ici, je fournis du code sur lequel je teste:

  1. J'ai créé une nouvelle base de données 'test' et saisi un document simple avec un seul attribut: type: "auto"

    db.test.insert({type:"auto"})
    
  2. sortie de l'appel de la fonction stats (): db.test.stats ():

    { 
      "ns" : "test.test",
      "count" : 1,
      "size" : 40,
      "avgObjSize" : 40,
      "storageSize" : 4096,
      "numExtents" : 1,
      "nindexes" : 1,
      "lastExtentSize" : 4096,
      "paddingFactor" : 1,
      "systemFlags" : 1,
      "userFlags" : 0,
      "totalIndexSize" : 8176,
      "indexSizes" : {
            "_id_" : 8176
    },
    "ok" : 1
    

    }

  3. sortie de l'appel de la fonction bsonsize: Object.bsonsize (db.test.find ({test: "auto"})))

    481
    
62
user1949763

J'ai trouvé une solution. Dans l'appel précédent de Object.bsonsize, mongo renvoyait la taille du curseur plutôt que le document lui-même.

La bonne façon est d'utiliser cette commande:

Object.bsonsize(db.test.findOne({type:"auto"}))

cela retournera la taille correcte du document particulier (en octets).

139
user1949763

La quantité effective d'espace que le document prendra dans la collection sera supérieure à la taille de votre document en raison du mécanisme Record Padding .

C'est pourquoi il y a une différence entre les sorties de db.test.stats() et Object.bsonsize(..).

Pour obtenir la taille du document exacte (en octets), utilisez la fonction Object.bsonsize().

27
Konstantin Yovkov

J'ai recommandé d'utiliser ce script pour obtenir la taille réelle.

db.users.find().forEach(function(obj)
{
  var size = Object.bsonsize(obj);
  print('_id: '+obj._id+' || Size: '+size+'B -> '+Math.round(size/(1024))+'KB -> '+Math.round(size/(1024*1024))+'MB (max 16MB)');
});

Remarque: Si vos identifiants sont des entiers 64 bits, les informations ci-dessus tronqueront la valeur de l'identifiant lors de l'impression! Si c'est le cas, vous pouvez utiliser à la place:

db.users.find().forEach(function(obj)
{
  var size = Object.bsonsize(obj);
  var stats =
  {
    '_id': obj._id, 
    'bytes': size, 
    'KB': Math.round(size/(1024)), 
    'MB': Math.round(size/(1024*1024))
  };
  print(stats);
});

Cela présente également l’avantage de renvoyer du JSON, ce qui permet à une interface graphique telle que RoboMongo de la tabuler!

source: https://stackoverflow.com/a/16957505/3933634

éditez: merci à @ zAlbee pour votre suggestion de finalisation.

20
Liberateur