我的rails应用程序中有以下代码。
module UserItem
class Rating
include MongoMapper::Document
key :user_id, Integer, :required => true
key :item_id, Integer, :required => true
key :rating, Float, :required => true
end
end
我有大约10K用户和10K项目,我需要为每个项目存储每个用户的评级,这大约是10 ^ 8条记录。我已将10 ^ 8条记录的值计算到数组中,如下所示
ratings = [
{user_id: 1, item_id: 1, rating: 1.5},
{user_id: 1, item_id: 2, rating: 3.5},
... and so on 10^8 records
]
现在,我需要将所有这些计算出的10 ^ 8条记录插入到mongo中。我试过
UserItem::Rating.collection.insert(ratings)
和
UserItem::Rating.create(ratings)
但将10 ^ 8条记录插入mongo需要数小时。有没有更好/更有效的方法将记录插入mongo?
上下文:我使用它更像是一个存储所有评级值的缓存存储。当我显示项目列表时,我将只读取此缓存并显示用户在每个项目旁边提供的评级。
非常感谢任何帮助!
答案 0 :(得分:1)
一种方法是为每个用户存储一个文档,其中的评级字段是项目ID对用户的哈希值,例如
class UserRating
include MongoMapper::Document
key :ratings
key :user_id
end
UserRating.create(:user_id => 1, :ratings => {"1" => 4, "2" => 3})
您必须使用字符串键作为哈希。这种方法无法轻松检索给定文档的所有评级 - 如果您这样做很多,则可能更容易为每个项目存储文档。如果您一次只需要一小部分用户的评分,那么它也可能效率不高。
显然,您可以将此与其他方法结合使用,以提高写入吞吐量,例如批量插入或分片数据库。