Mongoid: создание множества объектов одним вызовом - PullRequest
6 голосов
/ 07 декабря 2010

У меня есть 1000 пользователей, которых я буду извлекать из Twitter, и я хотел бы сохранить их за один раз, а не делать 1000 вставок по отдельности.

Как я могу это сделать в Mongoid?Примерно так бы и получилось:

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

Ответы [ 3 ]

7 голосов
/ 08 декабря 2010

Вы должны использовать драйвер Ruby Mongo, чтобы сделать это. Вы можете передать массив хэшей методу insert , чтобы создать несколько документов одновременно (дополнительную информацию об этом обсуждении групп Google ) 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)
2 голосов
/ 17 февраля 2015

Вы почти поняли, это 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!

Вставить документ или несколько документов в базу данных, вызывая ошибку, если возникает ошибка проверки.

0 голосов
/ 30 августа 2013

Просто используйте MongoidModel.create напрямую.

...