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
항목을 합치다$project
s 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
큰 문서뿐만 아니라 큰 문서 - 로 정렬해 .
limit
sort_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
'programing' 카테고리의 다른 글
Angular 5 서비스를 통해 로컬 .json 파일을 읽습니다. (0) | 2023.03.15 |
---|---|
jeast.fn()의 기능과 사용법은 무엇입니까? (0) | 2023.03.15 |
jQuery 및 JSON을 사용하여 양식을 채우시겠습니까? (0) | 2023.03.15 |
woocommerce에 커스텀 배송료를 추가하는 방법은? (0) | 2023.03.15 |
Chrome 업데이트로 인해 Ajax/Angular Network 렌더링 및 로드 속도가 느려졌습니다. (0) | 2023.03.15 |