2012-07-18 48 views
9

我使用Mongoid(V3)来访问的MongoDB,并要执行此操作:如何做一个更新插入/推与mongoid /助力车

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

这个作品在蒙戈外壳罚款。这也正是我想要的,因为它是一个对我来说很重要的单一的原子操作,因为我将会多次调用它。我不想做两个操作 - 一个抓取然后一个更新。我已经通过mongoid尝试了一堆东西,但无法让它工作。

我该如何获得MongoID并将该命令发送到MongoDB?我猜测在轻便摩托车级别有这样的方法,但该库的文档基本上是不存在的。

+1

你看到[助力车驱动程序文件(http://mongoid.org/en/moped/docs/ driver.html)? – 2012-07-28 04:23:48

回答

10

【答案发现在写的问题...]

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

下面是做到这一点的一种方法:

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

或者另:

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

#push执行原子$push在场上。它在 Atomic Persistence页面上解释。

(注:该示例使用UpperCamelCase和snake_case的是Ruby的约定。)

0

不要再往助力车只是还没有,你可以使用查找和修改操作来实现同样的事情(与所有默认范围和继承的好东西)

样品保存一个边缘的图形,如果不存在

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