【问题标题】:Mongoid: Creating many objects with a single callMongoid:一次调用创建多个对象
【发布时间】:2010-12-07 10:55:32
【问题描述】:

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

如何在 Mongoid 上做到这一点?像这样的东西会摇滚:

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

【问题讨论】:

  • 只是想知道,为什么你必须“一次性”做到这一点?
  • 这是一个面向用户的功能。用户会在我这样做的时候等待;)我想我可以缓存足够的数据以使 twitter 部分工作得足够快
  • 对于任何来到这里并认为这会使事情变得更快甚至原子的人 - check the code for yourself - 使用 insert_many - 它只是用每个项目调用自己并保存每个项目个人。

标签: ruby-on-rails mongodb mongoid


【解决方案1】:

您应该使用 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)

【讨论】:

  • 这个答案很好。谢谢!
  • 酷。 Mongo ruby​​ 驱动程序非常酷,Mongoid 使其非常容易访问。不要害怕使用 ruby​​ 驱动程序和原始 MongoDB 查询。
  • 是的,正在努力达到那种能力水平。与任何新技术一样,一开始需要相当多的帮助
【解决方案2】:

你几乎明白了,它是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!

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

【讨论】:

    【解决方案3】:

    直接使用 MongoidModel.create 即可。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多