2012-07-18 18 views
9

Tôi đang sử dụng Mongoid (v3) để truy cập MongoDB, và muốn thực hiện hành động này:Làm thế nào để làm một upsert/đẩy với mongoid/xe scooter

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

này hoạt động tốt trong vỏ Mongo. Nó cũng chính xác những gì tôi muốn vì nó là một hoạt động nguyên tử duy nhất quan trọng đối với tôi vì tôi sẽ gọi nó rất nhiều. Tôi không muốn phải thực hiện hai thao tác - tìm nạp và sau đó cập nhật. Tôi đã thử một loạt những thứ thông qua mongoid, nhưng không thể làm cho nó hoạt động được.

Làm cách nào để xóa MongoID và gửi lệnh này đến MongoDB? Tôi đoán có một số cách để làm điều này ở cấp độ xe máy, nhưng tài liệu của thư viện đó về cơ bản là không tồn tại.

+1

Cậu xem [Moped docs driver] (http://mongoid.org/en/moped/docs/ driver.html)? –

Trả lời

10

[trả lời tìm thấy trong khi viết các câu hỏi ...]

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

Dưới đây là một cách để làm điều đó:

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

Hoặc khác:

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

#push thực hiện một nguyên tử $push trên sân. Nó được giải thích trên trang Atomic Persistence.

(Lưu ý: các ví dụ sử dụng UpperCamelCase và snake_case như là ước Ruby.)

0

Đừng đi xuống xe máy chỉ được nêu ra, bạn có thể sử dụng tìm và sửa đổi hoạt động để đạt được điều tương tự (với tất cả các mặc định phạm vi và thừa kế goodies)

mẫu để tiết kiệm một cạnh trong một đồ thị nếu không tồn tại

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})