mongodb mapreduce, 实现 select sum(a*b) from test
迷茫
迷茫 2017-05-02 09:18:23
0
2
621

首先介绍user collection

user {'username':, 'age':, 'account':}

下面是正常的group_by 和count实现

//SQL实现

select username,count(sku) from user group by username

//MapReduce实现

map=function (){
    emit(this.username,{count:1})
}

reduce=function (key,values){
    var cnt=0;   
    values.forEach(function(val){ cnt+=val.count;});  
    return {"count":cnt}
}

//执行mapreduce

db.test.mapReduce(map,reduce,{out:"mr1"})

db.mr1.find()

{ "_id" : "Joe", "value" : { "count" : 416 } }
{ "_id" : "Josh", "value" : { "count" : 287 } }
{ "_id" : "Ken", "value" : { "count" : 297 } }

然后

//SQL实现

select sum(age * account) from user

//MapReduce实现,或者用其他方法实现也可以
???????????????????

迷茫
迷茫

业精于勤,荒于嬉;行成于思,毁于随。

모든 응답(2)
曾经蜡笔没有小新

일반적으로 MongoDB에서는 성능이 그다지 이상적이지 않으므로 map/reduce를 사용하지 않는 것이 좋습니다. 대부분의 경우 집계 프레임워크로 대체될 수 있으며, 특히 하나의 테이블만 관련된 경우에는 더욱 그렇습니다.

으아악

특정 구문은 Aggregation 구문을 확인해주세요. a*b좀 더 복잡해집니다. 실제로 필요한 것은 각 레코드의 a*b 값(pipline1)과 합계(pipline2)입니다.

으아악
Ty80

var map = function(){

으아아아

var 감소 = 함수(키, 값){

으아아아

위 정의가 완료된 후 실행: db.user.mapReduce(map,reduce,{out: "mr1"});
그런 다음 mr1의 문서 쿼리: db.mr1.find();
결과를 ​​얻을 것입니다

최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿