2012-07-18 8 views
9

estoy usando Mongoid (v3) para acceder a MongoDB, y desea llevar a cabo esta acción:Cómo hacer un upsert/de empuje con MongoId/ciclomotor

db.sessionlogs.update( 
    {sessionid: '12345'}, /* selection criteria */ 
    {'$push':{rows: "new set of data"}}, /* modification */ 
    true /* upsert */ 
); 

Esto funciona bien en la consola mongo. También es exactamente lo que quiero, ya que es una operación atómica única que es importante para mí ya que la voy a llamar mucho. No quiero tener que hacer dos operaciones: una búsqueda y luego una actualización. He intentado muchas cosas a través de mongoid, pero no puedo hacerlo funcionar.

¿Cómo puedo obtener MongoID fuera del camino y simplemente enviar este comando a MongoDB? Supongo que hay alguna forma de hacerlo en el nivel Moped, pero la documentación de esa biblioteca es básicamente inexistente.

+1

¿Has visto los documentos [conductor de ciclomotor] (http://mongoid.org/en/moped/docs/ driver.html)? –

Respuesta

10

[Respuesta encontró al escribir la pregunta ...]

criteria = Sessionlogs.collection.find(:sessionid => sessionid) 
criteria.upsert("$push" => {"rows" => datarow}) 
2

Aquí es una manera de hacerlo:

 
session_log = SessionLog.new(session_id: '12345') 
session_log.upsert 
session_log.push(:rows, "new set of data") 

U otro:

 
SessionLog.find_or_create_by(session_id: '12345'). 
    push(:rows, "new set of data") 

#push realiza una atomic $push en el campo. Se explica en la página Atomic Persistence.

(Nota: los ejemplos utilizan UpperCamelCase y snake_case como es el Convenio Ruby.)

0

No bajar al ciclomotor por el momento, puede utilizar encontrar y modificar el funcionamiento de lograr lo mismo (con todo el valor por defecto el alcance y la herencia golosinas)

Muestra para salvar una ventaja en un gráfico si no existía

edge = {source_id: session[:user_id],dest_id:product._id, name: edge_name} 
ProductEdge.where(edge).find_and_modify(ProductEdge.new(edge).as_document,{upsert:true}) 
Cuestiones relacionadas