programing

Mongodb에서 단일 문서의 크기를 얻는 방법은 무엇입니까?

muds 2023. 4. 1. 10:06
반응형

Mongodb에서 단일 문서의 크기를 얻는 방법은 무엇입니까?

몽고의 이상한 행동을 보았는데, 좀 더 명확히 하고 싶은데...
내 요청은 간단하다.컬렉션에 있는 단일 문서를 받고 싶습니다.저는 두 가지 가능한 해결책을 찾았습니다.

  • Object.bsonsize - 바이트 단위로 크기를 반환해야 하는 javascript 메서드
  • db.collection.stats() - 데이터 상에서 "집약"(평균) 크기 뷰를 생성하는 'avgObjSize' 행이 있습니다.단순히 단일 문서의 평균 크기를 나타냅니다.

  • 하나의 문서만으로 테스트 컬렉션을 만들면 두 함수가 서로 다른 값을 반환합니다.그게 어떻게 가능해?
    mongo 문서의 사이즈를 구할 수 있는 다른 방법이 있나요?

여기에서는 테스트에 사용하는 코드를 몇 가지 나타냅니다.

  1. 새 데이터베이스 'test'를 만들고 "auto" 유형만 가진 단순 문서를 입력했습니다.

    db.test.insert({type:"auto"})
    
  2. stats() 함수 호출로부터의 출력: db.test.syslog():

    { 
      "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. bsonsize 함수 호출로부터의 출력: Object.bsonsize(db.test.find({test:"auto"}))

    481
    

의 전회의 콜에서는Object.bsonsize()Mongodb는 문서가 아닌 커서의 크기를 반환했습니다.

올바른 방법은 다음 명령을 사용하는 것입니다.

Object.bsonsize(db.test.findOne())

와 함께findOne()특정 문서에 대한 쿼리를 정의할 수 있습니다.

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

그러면 특정 문서의 올바른 크기(바이트)가 반환됩니다.

최대 문서 크기 16 MiB (소스)


버전 > = 4.4 의 경우 ($bsonSize 소스)

db.users.aggregate([
  {
    "$project": {
      "size_bytes": { "$bsonSize": "$$ROOT" },
      "size_KB": { "$divide": [{"$bsonSize": "$$ROOT"}, 1000] },
      "size_MB": { "$divide": [{"$bsonSize": "$$ROOT"}, 1000000] }
    }
  }
])

버전이 4.4 미만인 경우(Object.bsonSize() 소스)

다음 스크립트를 사용하여 실제 크기를 가져올 수 있습니다.

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

주의: ID가 64비트 정수일 경우 인쇄 시 위의 ID 값이 잘립니다.이 경우 대신 다음을 사용할 수 있습니다.

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

JSON을 반환할 수 있는 장점도 있기 때문에 RoboMongo와 같은 GUI로 표화할 수 있습니다!


edit : 제안 완료에 대해 @zAlbee님 감사합니다.

레코드 패딩 메커니즘으로 인해 문서가 컬렉션에서 차지하는 유효 공간은 문서 크기보다 커집니다.

이 때문에, 출력에 차이가 있습니다.db.test.stats()그리고.Object.bsonsize(..).

문서의 정확한 크기(바이트)를 가져오려면Object.bsonsize()기능.

mongodb 4.4 (향후 출시)에서는 연산자를 사용하여 문서 크기를 가져올 수 있습니다.

db.test.aggregate([
  {
    "$project": {
      "name": 1,
      "object_size": { "$bsonSize": "$$ROOT" }
    }
  }
])

Object.bssonsize(db.test.findOne({type:"auto"})) 바이트 단위입니다.

★★Object.bsonsize()는, 레거시 「」에서만할 수 .mongo new 셸 new shell 。mongosh패키지 bson 또는 mongocompat 스니펫을 사용해야 합니다.

const BSON = require("bson");

BSON.calculateObjectSize({field: "value"})

BSON.calculateObjectSize(db.test.findOne())

언급URL : https://stackoverflow.com/questions/22008822/how-to-get-the-size-of-single-document-in-mongodb

반응형