Mongoid:通过一次调用创建多个对象

时间:2010-12-07 10:55:33

标签: ruby-on-rails mongodb mongoid

我有1000个用户,我将从Twitter检索,我想一次性保存它们,而不是单独进行1000次插入。

我怎样才能在Mongoid上做到这一点?这样的事情会摇滚:

TwitterUser.createMany([{:name=>u1}, {:name=>u2},{:name=>u3}] )

3 个答案:

答案 0 :(得分:7)

您应该使用Mongo ruby​​驱动程序来执行此操作。您可以将一组哈希值传递给insert method以一次创建多个文档(有关此google groups discussion的更多信息)。 Mongoid可以轻松访问ruby驱动程序。

代码看起来像这样:

user_list = twitter_accounts.map do |account|
  # create a hash of all the fields to be stored in each document
  { 'name' => account.name, 
    'username' => account.username 
    # some other fields...
  }
end

Mongoid.master['twitter_users'].insert(user_list)

答案 1 :(得分:1)

你几乎得到了它,create,而不是createMany。您可以像这样使用它:

TwitterUser.create([
  { username: "u1", display_name: "Display Name 1" },
  { username: "u2", display_name: "Display Name 2" },
  { username: "u3", display_name: "Display Name 3" }
])

此外,正如@bowsersenior指出的那样,将它与Array#Map一起使用是个好主意:

TwitterUser.create(
    @users_array.map do |u|
        { username: u.username, display_name: u.name }
    end
)

来自Mongoid#Persistence文档:

  

Model.create

     

将文档或多个文档插入数据库

     

Model.create!

     

将文档或多个文档插入数据库,如果发生验证错误则引发错误。

答案 2 :(得分:0)

直接使用MongoidModel.create。