まず第一に、Mongo map / reduceは(CouchDBのように)クエリツールとして使用するようには設計されていません。バックグラウンドタスクを実行するための設計です。職場で交通データの分析に使用しています。
ただし、間違っているのは、sort()を入力に適用しているということですが、map()
の場合は役に立たないため、 ステージが完了し、中間ドキュメントは各keys
で並べ替えられます 。キーはドキュメントであるため、product_id
で並べ替えられています 、popularity
。
これが私のデータセットを生成した方法です
function generate_dummy_data() {
for (i=2; i < 1000000; i++) {
db.foobar.save({
_id: i,
category_id: parseInt(Math.random() * 30),
popularity: parseInt(Math.random() * 50)
})
}
}
そして、これは私のマップ/リデュースタスクです:
var data = db.runCommand({
'mapreduce': 'foobar',
'map': function() {
emit({
sorting: this.popularity * -1,
product_id: this._id,
popularity: this.popularity,
}, 1);
},
'reduce': function(key, values) {
var sum = 0;
values.forEach(function(v) {
sum += v;
});
return sum;
},
'query': {category_id: 20},
'out': {inline: 1},
});
そしてこれが最終結果です(ここに貼り付けるのは非常に長いです):
http://cesarodas.com/results.txt
これが機能するのは、sorting, product_id, popularity
で並べ替えているためです。 。最終的な並べ替えはkey
によるものであることを覚えておいて、好きなように並べ替えを試すことができます。 入力の並べ替え方法に関係なく。
とにかく、前に言ったように、Map/Reduceでクエリを実行することは避けるべきです。これはバックグラウンド処理用に設計されています。もし私があなたなら、単純なクエリでデータにアクセスできるようにデータを設計するのであれば、この場合、単純なクエリを持つための複雑な挿入/更新には常にトレードオフがあります(これがMongoDBの見方です)。
>