Node + mongo заранее определяет размер документа [дубликат]

  1. Если вы хотите создать JAVA-объект из JSON и наоборот, используйте сторонние банки GSON или JACKSON и т. д.
    //from object to JSON 
    Gson gson = new Gson();
    gson.toJson(yourObject);
    
    // from JSON to object 
    yourObject o = gson.fromJson(JSONString,yourObject.class);
    
  2. Но если вы просто хотите разобрать строку JSON и получить некоторые значения, (ИЛИ создайте строку JSON с нуля для отправки по проводам) просто используйте JaveEE jar, который содержит JsonReader, JsonArray, JsonObject и т. д. Возможно, вам захочется загрузить реализацию этой спецификации, например javax.json. С этими двумя банками я могу разобрать json и использовать значения. Эти API фактически соответствуют модели XML-анализа DOM / SAX.
    Response response = request.get(); // REST call 
        JsonReader jsonReader = Json.createReader(new StringReader(response.readEntity(String.class)));
        JsonArray jsonArray = jsonReader.readArray();
        ListIterator l = jsonArray.listIterator();
        while ( l.hasNext() ) {
              JsonObject j = (JsonObject)l.next();
              JsonObject ciAttr = j.getJsonObject("ciAttributes");
    
48
задан user1949763 25 February 2014 в 10:45
поделиться

3 ответа

Я нашел решение. В предыдущем вызове Object.bsonsize mongo возвратил размер КУРСОРА, а не самого документа.

Правильный способ заключается в использовании этой команды:

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

это вернет правильный размер конкретного документа (в байтах).

110
ответ дан prostosmirienie 25 August 2018 в 05:12
поделиться

Я рекомендовал использовать этот скрипт, чтобы получить реальный размер.

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)');
});

Примечание. Если ваши идентификаторы являются 64-битными целыми числами, вышесказанное усечет значение идентификатора при печати! Если это так, вы можете использовать вместо этого:

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);
});

Это также имеет преимущество возврата JSON, поэтому графический интерфейс, подобный RoboMongo, может его табулировать!

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

edit: благодаря @zAlbee для вашего предложения.

13
ответ дан Community 25 August 2018 в 05:12
поделиться

Эффективный объем пространства, который будет принимать документ в коллекции, будет больше, чем размер вашего документа из-за механизма Record Padding .

Вот почему разница между выходами db.test.stats() и Object.bsonsize(..).

Чтобы получить точный размер (в байтах) документа, придерживайтесь функции Object.bsonsize().

24
ответ дан Konstantin Yovkov 25 August 2018 в 05:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: