我在 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" }
我打算进行交叉连接以产生以下集合
User_Item
{ "_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 会明显更快(理论上是)?
注意:没有外键