programing

MongoDB 컬렉션의 모든 문서에서 키 값을 합계하는 방법

telecom 2023. 5. 5. 08:36
반응형

MongoDB 컬렉션의 모든 문서에서 키 값을 합계하는 방법

MongoDB에 컬렉션이 있습니다.

{ "_id" : ObjectId("4d2407265ff08824e3000001"), "subida" : 3.95 }
{ "_id" : ObjectId("4d2551b4ae9fa739640df821"), "subida" : 6.03 }
{ "_id" : ObjectId("4d255b115ff08821c2000001"), "subida" : 5.53 }
{ "_id" : ObjectId("4d25e8d55ff08814f8000001"), "subida" : 1.96 }

키의 값을 요약하는 방법, 예:"subida"모든 문서에 걸쳐?위의 서류와 함께, 저는 다음과 같은 것을 받을 것입니다.

{ "subida" : 17.47 }

이 경우 mapReduce보다 집계가 훨씬 간단하고 효율적입니다.

db.collection.aggregate({
    $group: {
        _id: '',
        subida: { $sum: '$subida' }
    }
 }, {
    $project: {
        _id: 0,
        subida: '$subida'
    }
})
  1. 합계를 계산하기 위해 $sum과 함께 $group 사용
  2. $group 연산자에 필요한 ID 키를 제거하려면 프로젝션의 $project 연산자를 사용합니다.

저는 개인적으로 컬렉션에 대한 지도 축소를 수행할 것입니다.

맵은 "subida" 필드를 방출하는 간단한 함수입니다.단일 합계가 필요한 경우 키가 같아야 합니다. 감소한 결과 단일 개체가 생성됩니다.{<key>: <sum>},와 함께<key>배출물에서 제공한 값이 무엇이든 됩니다.

map = function() { emit(<key>, this.subida); }

축소는 또한 다음과 같은 간단한 함수를 합산합니다.

red = function(k, v) {
  var i, sum = 0;
  for (i in v) {
    sum += v[i];
  }
  return sum;
}

그런 다음 컬렉션에서 mapreduce를 호출할 수 있습니다.<mycollection>:

res = db.<mycollection>.mapReduce(map, red);

그러면 다른 컬렉션처럼 조작할 수 있는 임시 새 컬렉션이 만들어집니다.mapReduce에서 반환되는 값은 "result" 필드에 생성된 임시 컬렉션 이름뿐만 아니라 소요 시간, 상태... 등 mapReduce와 관련된 여러 값을 포함합니다.필요한 값을 가져오려면 해당 컬렉션을 쿼리해야 합니다.

db[res.result].find()

당신에게 그 물건을 줄 것입니다.{<key>: <sum>}.

MongoDB 1.7.4 이상을 실행하는 경우 MongoDB에 컬렉션을 만들지 않고 직접 결과를 반환하도록 요청하면 번거로움을 덜 수 있습니다.

db.<mycollection>.mapReduce(map, red, {out : {inline: 1}});

이 간단한 쿼리를 사용하여 결과의 합계를 가져옵니다.

db.collection.aggregate({
    $group: {
        _id: '',
        subida: { $sum: '$subida' }
    }
 }
)

옵션 0: MongoDB 집계 파이프라인 사용
[NB: 이 옵션은 이 질문이 있은 후 한참 후에 추가되었지만 지금은 올바른 접근 방식입니까?]


옵션 1: 모든 레코드를 쿼리하고 Mongo에서 subida 필드만 반환하고 Mongo 커서 클라이언트 측에서 반복하여 추가합니다.

옵션 2: 서브다이아 필드(모두에 대해 동일한 키)만 내보내는 맵 축소 명령을 작성한 다음 이를 합계하는 축소 명령을 작성합니다.

옵션 3: db.eval을 사용하여 서버에서 Javascript를 실행합니다. http://www.mongodb.org/display/DOCS/Server-side+Code+Execution

옵션 4: 컬렉션에 값을 삽입할 때 'subida' 값을 누적하여 필요할 때마다 최신 합계를 얻을 수 있습니다.총계를 다른 문서에 저장하고 원자적 "update if current" 작업을 사용하여 업데이트할 수 있습니다. http://www.mongodb.org/display/DOCS/Atomic+Operations

집합을 배열로 사용할 수 있습니다. 루프에 값을 추가하기만 하면 됩니다.

편집: 예, 큰 데이터 세트를 사용하는 경우에는 이 방법이 좋지 않습니다.

언급URL : https://stackoverflow.com/questions/4621300/how-to-sum-the-value-of-a-key-across-all-documents-in-a-mongodb-collection

반응형