2012-03-09 9 views
5

Usando Mongoid, ¿es posible usar "update_all" para insertar un valor en un campo de matriz para todas las entradas que coinciden con un criterio determinado?Con Mongoid, ¿puedo "actualizar_todos" para insertar un valor en un campo de matriz para varias entradas a la vez?

Ejemplo:

class Foo 
    field :username 
    field :bar, :type => Array 

    def update_all_bars 
    array_of_names = ['foo','bar','baz'] 
    Foo.any_in(username: foo).each do |f| 
     f.push(:bar,'my_new_val') 
    end 
    end 
end 

Me pregunto si hay una manera de actualizar todos los usuarios a la vez (para empujar el valor 'my_new_val' en el campo "foo" para cada entrada coincidente) usando "update_all "(o algo similar) en lugar de recorrerlos para actualizarlos de a uno por vez. Intenté todo lo que pude pensar y hasta ahora no tuve suerte.

Gracias

Respuesta

5

Se necesitan llamar a que desde el controlador de MongoDB. Que puede hacer:

Foo.collection.update( 
    Foo.any_in(username:foo).selector, 
    {'$push' => {bar: 'my_new_val'}}, 
    {:multi => true} 
) 

O

Foo.collection.update( 
    {'$in' => {username: foo}}, 
    {'$push' => {bar: 'my_new_val'}}, 
    {:multi => true} 
) 

se puede hacer un pull_request o una solicitud de función si desea que en Mongoid incorporado.

+0

Acaba de escribir la respuesta, también debe haber un tercer parámetro 'multi: true' – rubish

+0

tiene razón. Actualizo mi respuesta – shingara

+0

Brillante! ¡Muchas gracias! – orderedchaos

Cuestiones relacionadas