0

我的 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?

上下文:我使用它更像是存储所有评级值的缓存存储。当我显示项目列表时,我只会从这个缓存中读取,并在每个项目旁边显示用户提供的评分。

任何帮助深表感谢!

4

1 回答 1

1

一种方法是为每个用户存储一个文档,其评级字段是用户的项目 ID 哈希,例如

class UserRating
  include MongoMapper::Document
  key :ratings
  key :user_id
end

UserRating.create(:user_id => 1, :ratings => {"1" => 4, "2" => 3})

您必须对哈希使用字符串键。这种方法并不容易检索给定文档的所有评级 - 如果您经常这样做,那么存储每个项目的文档可能会更容易。如果您一次只需要一小部分用户的评分,它也可能不是很有效。

显然,您可以将其与增加写入吞吐量的其他方法结合使用,例如批量插入或分片数据库。

于 2013-07-21T14:46:29.227 回答