簡體   English   中英

Mongoid多原子操作

[英]Mongoid multiple atomic operations

我在內存中有一種Mongoid::Document 我想原子incpush在同一個呼叫。 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 incpush (以及幾乎所有其他原子操作)至少有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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM