이제 MapReduce를 사용하여 해결책을 찾았습니다. PHP에서 사용 중입니다.
$map = new MongoCode('
function() {
var d = new Date(this.date*1000);
emit({y: d.getFullYear(), m: d.getMonth()}, {
total: this.total,
notPaid: this.paid ? 0 : this.total,
count: 1
});
};
');
$reduce = new MongoCode('
function(month, values) {
result = { total: 0, notPaid: 0, count: 0 };
for (var i = 0; i < values.length; i++) {
result.total += values[i].total;
result.notPaid += values[i].notPaid;
result.count += values[i].count;
}
return result;
};
');
$result = $db->command(array(
'mapreduce' => 'invoices',
'map' => $map,
'reduce' => $reduce,
'out' => 'temp'
));
echo $result['timeMillis'];
이제는 결과가 "temp"컬렉션에 있습니다. 한 달에 하나의 문서입니다. 최적화 또는 향상 될 수 있습니까?
db.invoices.aggregate([
{
"$project" : {
"yr" : {
"$year" : "$date"
},
"mo" : {
"$month" : "$date"
},
"total" : 1,
"unpaid" : {
"$cond" : [
"$paid",
0,
"$total"
]
}
}
},
{
"$group" : {
"_id" : {
"y" : "$yr",
"m" : "$mo"
},
"total" : {
"$sum" : "$total"
},
"unpaid" : {
"$sum" : "$unpaid"
}
}
}
])
당신은에 꽤 최대 출력 끝에서 다른 $project
를 사용할 수 있으며, $sort
은 주문,하지만 그건의 기본 기능의 핵심입니다 :
나는 가혹한 것을 의미하지는 않지만, 직접 작성하고 커뮤니티에 당신을 위해 작성하도록 요청하지 않고 세부 사항에 대한 도움을 요청하면 더 잘 작동합니다. 자체 컬렉션에 결과를 저장하지 않으려면 집계 프레임 워크부터 시작하십시오. – JohnnyHK
@ JohnnHK, 전적으로 동의합니다. 저는 정말 배우기에 굉장히 많은 사람입니다. 기본 문법 만 알면 괜찮은 예를 찾을 수 없습니다. 그동안 나는 내 자신의 대답으로 결과를 얻는 뭔가를 얻었다. 이제는 다른 접근법, 어쩌면 집합으로이 작업을 수행해야하는지 여부가 문제입니다. mapreduce 구문이 매우 간단하고 간단합니다. –
mapreduce 구문이 마음에 든다면 성능이 적절하지 않은 경우에만 사용하십시오. 일반적으로 집계 프레임 워크가 빠릅니다. – JohnnyHK