Mongoid多原子操作

时间:2013-12-03 20:25:58

标签: ruby mongodb mongoid

我在记忆中有一种Mongoid::Document。我希望在同一个调用中以原子方式incpushMongoid::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的单个实例访问底层适配器?

3 个答案:

答案 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 incpush(以及几乎所有其他原子操作)至少有2次数据库命中(一次读取和一次更新)。


修改

如果你想使用mongoid进行更多高级查询和命令执行,你可以使用Moped(Mongoid使用Moped)

Moped driver documentation


修改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