私はmongodbに2つのコレクションを持っています
ユーザー
{ "_id" : ObjectId("..."), "type" : "user", "user_id" : "U1" }
{ "_id" : ObjectId("..."), "type" : "user", "user_id" : "U2" }
{ "_id" : ObjectId("..."), "type" : "user", "user_id" : "U3" }
アイテム
{ "_id" : ObjectId("..."), "type" : "item", "item_id" : "I1" }
{ "_id" : ObjectId("..."), "type" : "item", "item_id" : "I2" }
{ "_id" : ObjectId("..."), "type" : "item", "item_id" : "I3" }
{ "_id" : ObjectId("..."), "type" : "item", "item_id" : "I4" }
次のコレクションを生成するためにクロス結合を行う予定です
ユーザー_アイテム
{ "_id" : ObjectId("..."), "type" : "user_item", "item_id" : "I1", "user_id" : "U1", "score" : 0 }
{ "_id" : ObjectId("..."), "type" : "user_item", "item_id" : "I1", "user_id" : "U2", "score" : 0 }
{ "_id" : ObjectId("..."), "type" : "user_item", "item_id" : "I1", "user_id" : "U3", "score" : 0 }
{ "_id" : ObjectId("..."), "type" : "user_item", "item_id" : "I2", "user_id" : "U1", "score" : 0 }
{ "_id" : ObjectId("..."), "type" : "user_item", "item_id" : "I2", "user_id" : "U2", "score" : 0 }
{ "_id" : ObjectId("..."), "type" : "user_item", "item_id" : "I2", "user_id" : "U3", "score" : 0 }
{ "_id" : ObjectId("..."), "type" : "user_item", "item_id" : "I3", "user_id" : "U1", "score" : 0 }
{ "_id" : ObjectId("..."), "type" : "user_item", "item_id" : "I3", "user_id" : "U2", "score" : 0 }
{ "_id" : ObjectId("..."), "type" : "user_item", "item_id" : "I3", "user_id" : "U3", "score" : 0 }
{ "_id" : ObjectId("..."), "type" : "user_item", "item_id" : "I4", "user_id" : "U1", "score" : 0 }
{ "_id" : ObjectId("..."), "type" : "user_item", "item_id" : "I4", "user_id" : "U2", "score" : 0 }
{ "_id" : ObjectId("..."), "type" : "user_item", "item_id" : "I4", "user_id" : "U3", "score" : 0 }
次のコードを使用して取得できます
db.item.find().
forEach( function (i) {
db.user.find().
forEach( function (u) {
var row = {};
row.type = "user_item";
row.item_id = i.item_id;
row.user_id = u.user_id;
row.score = 0;
db.user_item.insert(row);
});
});
しかし問題は、この方法は大きなデータ (U=10,000、I = 10,000) では非常に遅いことです。mongodb で map-reduce を使用して同じ出力を生成する方法はありますか? map-reduce は大幅に高速になります (理論的にはそうです)。
注: 外部キーはありません