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'
}
})
- 합계를 계산하기 위해 $sum과 함께 $group 사용
- $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
'programing' 카테고리의 다른 글
Linux bash에서 타일의 의미(홈 디렉토리가 아님) (0) | 2023.05.10 |
---|---|
셀이 텍스트 문자열로 시작하는 경우...공식 (0) | 2023.05.10 |
dyld: 라이브러리가 로드되지 않음: @rpath/libswift_stdlib_core.dylib (0) | 2023.05.05 |
ICollectionView 또는 ObservableCollection에 바인딩해야 합니까? (0) | 2023.05.05 |
String의 차이점은 무엇입니까?비어 있고 "(빈 문자열)? (0) | 2023.05.05 |