2011-10-11 73 views
2

是否有可能將自定義JavaScript傳遞給Mongoid類似於查找活動記錄中的find_by_sql或update_all?在Mongoid中的自定義查詢

我在想的特定情況是我想inc上的一個字段符合條件的一堆文件。

看起來這是可能的MongoDB中: http://www.mongodb.org/display/DOCS/Updating#Updating-ModifierOperations

db.people.update({ name:"Joe" }, { $inc: { created_at : -1 } }); 

,但我不事Mongoid允許它(它似乎只讓你在時代公司一個文檔)。而他們的update_all方法我相信只能使用$ set。謝謝! http://mongoid.org/docs/querying/modification.html

例如,這不起作用

User.where(:name => "Joe").update_all("{ $inc: { created_at : -1 } }") 

回答

1

Mongoid提供Model#inc方法,但它是一個實例方法,而不是一個類的方法。

但是,通過閱讀Model.update_all方法的源代碼,事實證明,您可以輕鬆創建自己的inc類方法。

def update_all(attributes = {}) 
    klass.collection.update(
    selector, 
    { "$set" => attributes }, 
    Safety.merge_safety_options(:multi => true) 
).tap do 
    Threaded.clear_safety_options! 
    end 
end 

正如您所看到的,Mongoid正在將查詢傳遞給基礎mongodb驅動程序。 下面的方法應該工作

class User 
    def self.inc(field, value) 
    klass.collection.update(
     selector, 
     { "$inc" => { field => value } }, 
     Safety.merge_safety_options(:multi => true) 
    ).tap do 
     Threaded.clear_safety_options! 
    end 
    end 
end 

請注意我沒有測試它。

+0

該解決方案效果很好!謝謝Simone。非常感激。我可以看到這將在未來的版本中添加到Mongoid中。 –

1

怎麼樣在更新命令多標誌符

按照該mongodb

db.collection.update(標準,objNew,upsert,多)

multi - 表示是否應該更新所有匹配條件的文檔 而不僅僅是一個。可以在下面的$操作符中使用。

所以設置多標誌真正在你更新命令

db.people.update({ name:"Joe" }, { $inc: { created_at : -1 } },false,true);