programing

MongoDB에서 가장 큰 문서 크기 찾기

newstyles 2023. 3. 15. 19:27

MongoDB에서 가장 큰 문서 크기 찾기

MongoDB에서 가장 큰 문서 사이즈를 찾을 수 있나요?

db.collection.stats()에 평균 사이즈를 나타냅니다.이 경우는 사이즈가 크게 다를 수 있기 때문에 대표적이지 않습니다.

작은 셸 스크립트를 사용하여 이 값을 가져올 수 있습니다.

주의: 이렇게 하면 전체 테이블 검색이 수행되며, 대량 수집에서는 속도가 느려집니다.

let max = 0, id = null;
db.test.find().forEach(doc => {
    const size = Object.bsonsize(doc); 
    if(size > max) {
        max = size;
        id = doc._id;
    } 
});
print(id, max);

(「」: 「」로부터)..toArray빅세트에 합니다.) 빅 데이터 세트에 주의합니다.야!Abishek의 답변은 메모리 배열에 있는 것이 아니라 커서 상에서 작업할 수 있는 장점이 있습니다.

_id도 필요한 경우 이 방법을 사용해 보십시오."requests"라는 이름의 컬렉션이 지정됩니다.

// Creates a sorted list, then takes the max
db.requests.find().toArray().map(function(request) { return {size:Object.bsonsize(request), _id:request._id}; }).sort(function(a, b) { return a.size-b.size; }).pop();

// { "size" : 3333, "_id" : "someUniqueIdHere" }

★★★★★Mongo 4.4새로운 집약 연산자는 BSON으로 인코딩된 경우 특정 문서의 크기를 바이트 단위로 반환합니다.

따라서 크기가 가장 큰 문서의 bson 크기를 찾으려면 다음과 같이 하십시오.

// { "_id" : ObjectId("5e6abb2893c609b43d95a985"), "a" : 1, "b" : "hello" }
// { "_id" : ObjectId("5e6abb2893c609b43d95a986"), "c" : 1000, "a" : "world" }
// { "_id" : ObjectId("5e6abb2893c609b43d95a987"), "d" : 2 }
db.collection.aggregate([
  { $group: {
    _id: null,
    max: { $max: { $bsonSize: "$$ROOT" } }
  }}
])
// { "_id" : null, "max" : 46 }

이것은, 다음과 같습니다.

  • $group 항목을 합치다
  • $projects the$max서문 documents$bsonSize
  • $$ROOT bsonsize를 취득한 현재 문서를 나타냅니다.

MongoDB 컬렉션에서 가장 큰 문서를 찾는 속도는 집계 프레임워크와 컬렉션 문서에 대한 약간의 지식을 사용하여 다른 답변보다 최대 100배 더 빠를 수 있습니다.또, 다른 어프로치에서는 몇분이 아닌 몇초만에 결과를 얻을 수 있습니다(forEach클라이언트에게 모든 문서를 가져오는 경우).

문서의 어떤 필드가 가장 큰지 알아야 합니다(거의 항상 알 수 있습니다).다양한 크기를 가질 수 있는 실용적인 MongoDB 유형은 두 가지뿐입니다1.

  • 어레이
  • 줄들

집약 프레임워크는 각각의 길이를 계산할 수 있습니다.어레이의 사이즈는 바이트 단위로 얻을 수 없지만 요소의 길이는 얻을 수 있습니다.그러나 일반적으로 더 중요한 것은 어떤 특이치 문서의 바이트 수가 아니라 어떤 특이치 문서인지입니다.

어레이의 방법은 다음과 같습니다.를 들어, 소셜 컬렉션이 .friends.ids 클 수 있습니다를 둘 필요가 ).friendsCount어레이와 동기하고 있습니다만, 예를 들어 사용할 수 없는 것으로 간주합니다).

db.users.aggregate([
    { $match: {
        'friends.ids': { $exists: true }
    }},
    { $project: { 
        sizeLargestField: { $size: '$friends.ids' } 
    }},
    { $sort: {
        sizeLargestField: -1
    }},
])

중요한 것은 집약 파이프라인 연산자를 사용하는 것입니다.배열에서만 작동하므로 텍스트 필드는 어떻게 됩니까?교환원을 이용할 수 있습니다.예를 들어, 우리가 이 문제를bio을 사용하다

db.users.aggregate([
    { $match: {
        bio: { $exists: true }
    }},
    { $project: { 
        sizeLargestField: { $strLenBytes: '$bio' } 
    }},
    { $sort: {
        sizeLargestField: -1
    }},
])

때 같이 쓸 수도 요.$size ★★★★★★★★★★★★★★★★★」$strLenBytes를 사용합니다.$sum여러 필드의 크기를 계산합니다.대부분의 경우 필드의 20% 크기의 80%(10/90 또는 1/99는 아님)를 차지하며, 큰 필드는 문자열 또는 어레이여야 합니다.


1 기술적으로는 거의 사용되지 않는binData타이핑하다

음.. 이건 오래된 질문인데..하지만 나는 그것에 대해 내 돈을 나누려고 생각했다.

접근법 - 사용 - Mongo 사용mapReduce

먼저 각 문서의 크기를 확인합니다.

db.myColection.mapReduce
(
   function() { emit(this._id, Object.bsonsize(this)) }, // map the result to be an id / size pair for each document
   function(key, val) { return val }, // val = document size value (single value for each document)
   { 
       query: {}, // query all documents
       out: { inline: 1 } // just return result (don't create a new collection for it)
   } 
)

문서 할 수 , 로 저장하는 더접근 그, 크기는 모두 반환됩니다).다만, 문서 크기를 컬렉션으로 보존하는 것이 보다 좋은 방법입니다(그 결과, 문서 사이즈는result를 선택합니다.

두 번째 - 이 쿼리를 조작하여 문서의 최대 크기를 가져옵니다.

db.metadata.mapReduce
(
    function() { emit(0, Object.bsonsize(this))}, // mapping a fake id (0) and use the document size as value
    function(key, vals) { return Math.max.apply(Math, vals) }, // use Math.max function to get max value from vals (each val = document size)
    { query: {}, out: { inline: 1 } } // same as first example
)

최대 문서 크기와 동일한 값을 가진 단일 결과를 제공합니다.

요컨대:

번째 할 수 : " " " " " " " " " " " " " " " " " " " " " " " " " " " " ( " " " " " " " " " ( " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " "out" " " " " " " " " " " " " " " " " " " " ( " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " 。

-아니면...

단일 통계(최소, 최대, 평균 등)를 얻기 위해 단일 쿼리(두 번째 옵션)를 사용할 수 있습니다.

대량의 컬렉션을 사용하고 있는 경우는, 메모리내에 한꺼번에 로드하는 것은 동작하지 않습니다.이는 컬렉션 전체의 크기보다 더 많은 RAM이 필요하기 때문입니다.

대신 내가 작성한 다음 패키지를 사용하여 전체 컬렉션을 일괄 처리할 수 있습니다.https://www.npmjs.com/package/mongodb-largest-documents

MongoDB 연결 문자열과 컬렉션 이름만 제공하면 됩니다.스크립트는 전체 집합을 일괄적으로 통과하면 상위 X개 문서를 출력합니다.

프리뷰

Elad Nana 패키지에서 영감을 얻었지만 MongoDB 콘솔에서 사용할 수 있습니다.

function biggest(collection, limit=100, sort_delta=100) {
  var documents = [];
  cursor = collection.find().readPref("nearest");
  while (cursor.hasNext()) {
    var doc = cursor.next();
    var size = Object.bsonsize(doc);
    if (documents.length < limit || size > documents[limit-1].size) {
      documents.push({ id: doc._id.toString(), size: size });
    }
    if (documents.length > (limit + sort_delta) || !cursor.hasNext()) {
      documents.sort(function (first, second) {
        return second.size - first.size;
      });
      documents = documents.slice(0, limit);
    }
  }
  return documents;
}; biggest(db.collection)
  • 커서 사용
  • 에 대한 목록을 제공합니다.limit 큰 문서뿐만 아니라 큰 문서
  • 로 정렬해 .limitsort_delta
  • nearest읽기 기본 설정(사용할 수도 있음)rs.slaveOk()슬레이브 노드에 있는 경우 컬렉션을 나열할 수 있습니다.)

Xavier Guihot이 이미 언급했듯이, 새로운 $bsonSize 집약 연산자가 Mongo 4.4에 도입되었습니다.이 연산자는 오브젝트의 크기를 바이트 단위로 제공할 수 있습니다.그리고 저만의 사례와 통계를 제공하고자 했습니다.

사용 예:

// I had an `orders` collection in the following format
[
  {
    "uuid": "64178854-8c0f-4791-9e9f-8d6767849bda",
    "status": "new",
    ...
  },
  {
    "uuid": "5145d7f1-e54c-44d9-8c10-ca3ce6f472d6",
    "status": "complete",
    ...
  },
  ...
];

// and I've run the following query to get documents' size
db.getCollection("orders").aggregate(
  [
    {
      $match: { status: "complete" } // pre-filtered only completed orders
    },
    {
      $project: {
        uuid: 1,
        size: { $bsonSize: "$$ROOT" } // added object size
      }
    },
    {
      $sort: { size: -1 }
    },
  ],
  { allowDiskUse: true } // required as I had huge amount of data
);

그 결과 크기별 서류 목록을 내림차순으로 받았습니다.

통계:

최대 300만 개의 레코드와 최대 70GB의 크기를 수집하기 위해 위의 쿼리는 최대 6.5분이 소요되었습니다.

언급URL : https://stackoverflow.com/questions/16953282/find-largest-document-size-in-mongodb