[英]Mongoid multiple atomic operations
我在內存中有一種Mongoid::Document
。 我想原子inc
和push
在同一個呼叫。 Mongoid::Criteria
僅單獨公開這些操作。
my_model = SomeModel.find "foo"
壞:
my_model.inc foo: 1
my_model.push bar: "b"
好:
my_model.underlying_adapter.update "$inc" => {foo: 1}, "$push" => {bar: "b"}
問題是,如何為單個Mongoid::Document
實例訪問底層適配器?
您可以使用moped(mongoid使用的ruby適配器)直接進行此操作以及您希望在單個查詢中實現的其他復雜原子操作:
SomeModel.collection.find("_id" => "foo").update({
'$inc' => {"foo" => 1},
'$push' => {"bar" => "b"}})
我不知道你原子意味着什么? 永恆而沒有驗證?
your_model.inc_field = your_model.inc_field + inc_value
your_model.push_field << pushable
your_model.timeless.save(validate: false)
PS:Mongoid inc
和push
(以及幾乎所有其他原子操作)至少有2個數據庫命中(一次讀取和一次更新)。
編輯
如果你想使用mongoid進行更高級的查詢和命令執行,你可以使用Moped(Mongoid使用Moped)
編輯2
它是mongoid的限制(直到當前的穩定版本 - 3.1.6),參考這個問題 - 在mongoid的版本4中(尚未發布)用戶可以原子地(也可鏈接)進行單一寫操作Mongoid Changelog ISSUE#1344
從你的代碼中,我看到你在內存中有模型,它至少有2個DB命中,1個用於讀取,1個用於寫入(即使使用鏈式原子操作),Mongoid4修復了(1個DB命中單個原子操作,例如: Band.where(name: "Depeche Mode").inc(likes: 10, followers: 20)
或者使用document.atomically &:block
syntax)
MongoDB中的所有寫入操作都是單個文檔級別的原子操作。 MongoDB文檔
我不是紅寶石專家,但也許你可以使用find_and_modify
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.