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


87

나는 mongo의 이상한 행동을 만났고 그것을 조금 명확히하고 싶습니다.
내 요청은 다음과 같이 간단합니다. 단일 문서의 크기를 수집하고 싶습니다. 두 가지 가능한 해결책을 찾았습니다.

  • Object.bsonsize-크기를 바이트 단위로 반환해야하는 자바 스크립트 메서드
  • db.collection.stats ()-데이터에 대해 "집계 된"(평균) 크기보기를 생성하는 'avgObjSize'줄이 있습니다. 단일 문서의 평균 크기를 나타냅니다.

  • 문서가 하나만있는 테스트 컬렉션을 만들면 두 함수가 서로 다른 값을 반환합니다. 그게 어떻게 가능해?
    몽고 문서의 크기를 얻는 다른 방법이 있습니까?

여기에서 테스트를 수행하는 몇 가지 코드를 제공합니다.

  1. 새 데이터베이스 'test'를 만들고 type : "auto"라는 속성 하나만있는 간단한 문서를 입력했습니다.

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

    481
    

답변:


179

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

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

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

를 사용하면 findOne()특정 문서에 대한 쿼리를 정의 할 수 있습니다.

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

특정 문서의 정확한 크기 (바이트)를 반환합니다.


1
쿼리로 문서 목록의 크기를 얻는 방법은 무엇입니까?
leon

그러나 물론이 코드는 크기를 계산하기 전에 문서를 가져옵니다.
세르칸하기 Ozdemir

:하지만 ...이 (:이 goood 크기를 반환하지 stackoverflow.com/a/40993183/3933634
Liberateur

3
Object.bsonsize를 얻는 방법, import 또는 required 문은 무엇입니까?
PARAMANANDA PRADHAN

7
그것을 놓친 다른 사람은 대신에 사용해야 findOne합니다find
Sam

36

실제 크기를 얻으려면이 스크립트를 사용하는 것이 좋습니다.

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

참고 : 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/(1024)), 
    'MB': Math.round(size/(1024*1024))
  };
  print(stats);
});

이것은 또한 JSON을 반환하는 이점이 있으므로 RoboMongo와 같은 GUI가이를 표로 만들 수 있습니다!

출처 : https://stackoverflow.com/a/16957505/3933634

편집 : 제안 완료 를 위해 @zAlbee 에게 감사드립니다 .


이것은 정확히 내가 찾고 있지만 내 몽고 버전과 관련이있을 수 있습니다. 현재 3.4?
Erce dec

다른 사람이 TypeError: Object.bsonsize is not a function있습니까?
Félix Paradis

몽고 쉘을 사용해 보셨습니까? 그것의 일 : docs.mongodb.com/manual/reference/mongo-shell/#miscellaneous
Liberateur

적절한 라벨은 오히려 'KiB': Math.round(size/(1024)), 'MiB': Math.round(size/(1024*1024))(또는'kB': Math.round(size/(1000)), 'MB': Math.round(size/(1000*1000))
Wernfried Domscheit

31

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

이것이 db.test.stats()와 의 출력간에 차이가있는 이유 Object.bsonsize(..)입니다.

문서 의 정확한 크기 (바이트) 를 얻으려면 Object.bsonsize()함수를 고수하십시오 .


답장을 보내 주셔서 감사합니다.이 경우이 문제에 대한 또 다른 질문이 있습니다. 긴 식별자 목록이있는 문서가 목록 형식으로 저장된 컬렉션이 있다고 가정 해 보겠습니다. (식별자는 원래 크기가 300kB 인 txt-csv 파일에 저장됩니다. 각 식별자는 10 자 길이입니다.) 이러한 문서에서 bsonsize 를 실행 하면 크기가 481보다 훨씬 작습니다. 465를 반환합니다.이 상황을 설명해 주시겠습니까? 부디?
user1949763 2014

4
mongDB 문서 크기 제한을 적용하는 데 사용되는 크기는 무엇입니까? Object.bsonsize ()?
John Evans

MongoDB 문서 크기는 Mongo의 제약이며, 웹 사이트의 설명서 인 16MB에서 다룹니다. 가져 오기 레코드를 시도하는 동안이 제한에 여러 번 도달했습니다.
htm11h

3

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.