복붙노트

[MONGODB] MongoDB의에서 가장 큰 문서 크기를 찾기

MONGODB

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

그것은 MongoDB의 가장 큰 문서 크기를 찾을 수 있습니까?

때문에 내 경우 크기에 db.collection.stats은 () 정말 대표하지 않습니다 평균 크기를 보여줍니다 상당히 다를 수 있습니다.

해결법

  1. ==============================

    1.이 값을 얻기 위해 작은 쉘 스크립트를 사용할 수 있습니다.

    이 값을 얻기 위해 작은 쉘 스크립트를 사용할 수 있습니다.

    참고 :이 대형 컬렉션에 느려질 수 전체 테이블 스캔을 수행합니다.

    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);
    
  2. ==============================

    2.참고 :이 (.toArray에서) 메모리에 전체 결과 집합을 저장하려고합니다. 큰 데이터 세트에주의. 생산에 사용하지 마십시오! Abishek의 대답은 메모리 어레이에 커서를 통해 대신의를 통해 작업의 장점이있다.

    참고 :이 (.toArray에서) 메모리에 전체 결과 집합을 저장하려고합니다. 큰 데이터 세트에주의. 생산에 사용하지 마십시오! Abishek의 대답은 메모리 어레이에 커서를 통해 대신의를 통해 작업의 장점이있다.

    당신은 또한 _id를 원하는 경우에, 이것을 시도. "요청"라는 컬렉션을 감안할 때 :

    // 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" }
    
  3. ==============================

    3.MongoDB의 컬렉션 최대 규모의 문서를 찾기 ~ 100 배 더 빨리 통합 프레임 워크와 컬렉션의 문서에 대한 지식의 작은 비트를 사용하여 다른 답변보다 수 있습니다. 또한, 당신은 다른 방법 (대해 forEach, 또는 더 나쁜, 클라이언트에 모든 문서를 받고)와 초 결과, 대 분을 얻을 것이다.

    MongoDB의 컬렉션 최대 규모의 문서를 찾기 ~ 100 배 더 빨리 통합 프레임 워크와 컬렉션의 문서에 대한 지식의 작은 비트를 사용하여 다른 답변보다 수 있습니다. 또한, 당신은 다른 방법 (대해 forEach, 또는 더 나쁜, 클라이언트에 모든 문서를 받고)와 초 결과, 대 분을 얻을 것이다.

    당신은 거의 항상 알 것이다 - 당신은 큰 사람이 될 수있는 문서에있는 필드 (들)을 알아야합니다. 변수 크기를 가질 수 두 practical1 MongoDB의 유형이 있습니다 :

    집계 프레임 워크는 각각의 길이를 계산할 수 있습니다. 당신이 배열의 크기 (바이트)하지만 요소의 길이를하지 않습니다. 그러나 무엇보다 일반적으로 중요한 것은 그들이 가지고 정확히 얼마나 많은 바이트, 아웃 라이어 문서가있는 것입니다.

    여기가 배열을 위해 어떻게하는지입니다. 예를 들어, 이제 우리는 소셜 네트워크에서 사용자의 컬렉션이 있다고 가정하자 우리는 (배열 friends.ids이 매우 큰 수 있습니다 의심 실제로 당신은 아마 배열과 동기화 friendsCount 같은 별도의 필드를 유지하지만 위해서해야 예를 들어, 우리는 가정합니다 즉,)를 사용할 수 없습니다입니다 :

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

    열쇠는 $ 크기 집계 파이프 라인 연산자를 사용하는 것입니다. 그것은 단지 어떤 텍스트 필드에 대해 이렇게하지만 배열에서 작동? 우리는 $ strLenBytes 연산자를 사용할 수 있습니다. 이제 우리는 바이오 분야도 매우 큰 생각되는 가정 해 봅시다 :

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

    또한 $ 크기 및 여러 필드의 크기를 계산 $ 합계를 사용하여 $ strLenBytes을 결합 할 수 있습니다. 대부분의 경우에서 필드의 20 % 크기 (안 10/90 또는 1/99의 경우)의 80 %를 차지하며, 대규모 필드는 문자열이나 배열이어야합니다.

    (1) 기술적으로는 거의 사용되지 binData의 유형은 변수 크기를 가질 수있다.

  4. ==============================

    4.당신은 거대한 컬렉션 작업하는 경우 당신이 직장에 그의 전체 컬렉션의 크기보다 더 많은 RAM이 필요합니다 이후,하지 않습니다 작업 메모리에 한 번에 모두로드.

    당신은 거대한 컬렉션 작업하는 경우 당신이 직장에 그의 전체 컬렉션의 크기보다 더 많은 RAM이 필요합니다 이후,하지 않습니다 작업 메모리에 한 번에 모두로드.

    대신, 당신은 내가 만든 다음 패키지를 사용하여 일괄 적으로 전체 컬렉션을 처리 할 수 ​​있습니다 : https://www.npmjs.com/package/mongodb-largest-documents

    당신이해야 할 MongoDB를 연결 문자열 및 수집 이름을 제공합니다. 스크립트가 출력 상단은 X 최대 규모의 문서가 일괄 적으로 전체 컬렉션을 통과 완료됩니다.

  5. ==============================

    5.음 ..이 오래된 질문이다 ..하지만 - 나는 그것에 대해 내 센트를 공유 할 생각

    음 ..이 오래된 질문이다 ..하지만 - 나는 그것에 대해 내 센트를 공유 할 생각

    나의 접근 방식 - 사용 몽고 맵리 듀스 기능

    첫째 -의 각 문서의 크기를하자

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

    이 콜렉션로 저장하는 것이 더 나은 방법은 언급 할만큼 가치 있다고하지만이 모든 문서를 크기를 반환합니다 (결과는 결과 필드 내의 결과의 배열입니다)

    둘째 -이 쿼리를 조작하여의 문서의 최대 크기를하자

    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
    )
    

    값이 최대 문서 크기에 동일 당신에게 하나의 결과를 제공 할 것입니다 어떤

    한마디로 :

    첫 번째 예제를 사용하고 그 위에 추가 집계를 적용 모음 (컬렉션 당신이 원하는 이름에 옵션을 밖으로 변경)로 출력을 저장할 수 있습니다 (최대 크기, 최소 크기 등)

    -또는-

    당신은 하나의 통계 (최소, 최대, 평균 등)을 가져 오기위한 하나의 쿼리 (두 번째 옵션)를 사용할 수 있습니다

  6. ==============================

    6.MongoDB를 콘솔에서 Elad 나나의 패키지에서 영감을하지만, 사용할 수 :

    MongoDB를 콘솔에서 Elad 나나의 패키지에서 영감을하지만, 사용할 수 :

    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)
    
  7. from https://stackoverflow.com/questions/16953282/find-largest-document-size-in-mongodb by cc-by-sa and MIT license