我在记忆中有一种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
的单个实例访问底层适配器?
答案 0 :(得分:1)
你可以直接使用moped(mongoid使用的ruby适配器)和你想在单个查询中实现的其他复杂原子操作:
SomeModel.collection.find("_id" => "foo").update({
'$inc' => {"foo" => 1},
'$push' => {"bar" => "b"}})
答案 1 :(得分:0)
我不知道你原子意味着什么?永恒而没有验证?
your_model.inc_field = your_model.inc_field + inc_value
your_model.push_field << pushable
your_model.timeless.save(validate: false)
P.S:Mongoid inc
和push
(以及几乎所有其他原子操作)至少有2次数据库命中(一次读取和一次更新)。
修改强>
如果你想使用mongoid进行更多高级查询和命令执行,你可以使用Moped(Mongoid使用Moped)
修改2
它是mongoid的限制(直到当前的稳定版本 - 3.1.6),参考这个issue - 在mongoid的版本4中(尚未发布),用户可以原子地进行单一写操作(也可以是可链接的){ {3}}
从你的代码中,我看到你在内存中有模型,它至少有2个DB命中,1个用于读取,1个用于写入(即使使用链式原子操作),Mongoid4修复了(1个数据库命中单个原子操作,例如:Band.where(name: "Depeche Mode").inc(likes: 10, followers: 20)
或document.atomically &:block
语法)
MongoDB中的所有写入操作都是单个文档级别的原子操作。 Mongoid Changelog ISSUE#1344
答案 2 :(得分:-1)
我不是红宝石专家,但也许您可以使用find_and_modify