我在内存中有一种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单个实例的底层适配器
发布于 2014-04-29 21:57:46
你可以直接使用moped ( mongoid使用的ruby适配器)来完成这个操作和其他复杂的原子操作,这些操作都是你想在一个查询中实现的:
SomeModel.collection.find("_id" => "foo").update({
'$inc' => {"foo" => 1},
'$push' => {"bar" => "b"}})发布于 2013-12-04 08:32:55
我不知道你说的原子是什么意思?永恒的,没有验证的?
your_model.inc_field = your_model.inc_field + inc_value
your_model.push_field << pushable
your_model.timeless.save(validate: false)附注: Mongoid、inc和push (以及几乎所有其他原子操作)至少有2次数据库命中(一次读取和一次更新)。
编辑
如果你想使用mongoid进行更高级的查询和命令执行,你可以使用Moped (Mongoid使用Moped)
Moped driver documentation
编辑2
这是Mongoid Changelog ISSUE#1344的局限性(直到当前稳定版本- 3.1.6),参考mongoid版本4中的这个issue - In (尚未发布),用户可以原子(也可以链接) mongoid进行单次写操作
从你的代码中,我看到你的模型在内存中至少有2个DB命中,1个用于读,1个用于写(即使使用链接的原子操作),Mongoid4修复了这个问题(1个DB使用单个原子操作,例如:Band.where(name: "Depeche Mode").inc(likes: 10, followers: 20)或document.atomically &:block语法)
MongoDB中的所有写操作在单个文档级别上都是原子的。MongoDB Docs
发布于 2013-12-04 06:43:50
我不是红宝石专家,但也许你可以用find_and_modify
https://stackoverflow.com/questions/20360956
复制相似问题