2010-12-07 11 views
5

Tengo 1000 usuarios que voy a recuperar de Twitter, y me gustaría guardarlos de una vez, en lugar de hacer 1000 inserciones individualmente.Mongoid: Creando muchos objetos con una sola llamada

¿Cómo puedo hacer esto en Mongoid? Algo como esto sería rock:

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

Solo me pregunto, ¿por qué tienes que hacer esto "de una vez"? –

+0

es una característica de cara al usuario. el usuario estaría esperando mientras hago esto;) Creo que puedo almacenar en caché suficientes datos para hacer que la parte de Twitter funcione lo suficientemente rápido –

Respuesta

7

Debe utilizar el controlador de Ruby Mongo para hacerlo. Puede pasar una matriz de valores hash al insert method para crear varios documentos a la vez (más información en este google groups discussion). Mongoid facilita el acceso al controlador ruby.

El código sería algo como esto:

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) 
+0

esto lo responde bien. ¡Gracias! –

+0

Cool. El driver Ruby de Mongo es genial y Mongoid lo hace muy fácil de acceder. No tengas miedo de usar el controlador de ruby ​​y las consultas de MongoDB sin procesar. – bowsersenior

+0

sí, tratando de llegar a ese nivel de competencia. como con cualquier nueva tecnología, necesita un poco de asidero al inicio –

0

sólo tiene que utilizar MongoidModel.create directamente.

1

Casi lo tienes, es create, no createMany. Se puede utilizar de esta manera:

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

También, como @bowsersenior señala, es una buena idea para usarlo con Array#Map:

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

De los Mongoid#Persistence Docs:

Model.create

insertar un documento o varios documentos en la base de datos

Model.create!

Insertar un documento o varios documentos en la base de datos, levantando un error si se produce un error de validación.

Cuestiones relacionadas