首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mongoid多原子操作

Mongoid多原子操作
EN

Stack Overflow用户
提问于 2013-12-04 04:25:58
回答 3查看 1K关注 0票数 5

我在内存中有一种Mongoid::Document。我想在同一个调用中原子地incpushMongoid::Criteria仅单独公开这些操作。

my_model = SomeModel.find "foo"

不好:

代码语言:javascript
复制
my_model.inc foo: 1
my_model.push bar: "b"

好:

my_model.underlying_adapter.update "$inc" => {foo: 1}, "$push" => {bar: "b"}

问题是,我如何访问Mongoid::Document单个实例的底层适配器

EN

回答 3

Stack Overflow用户

发布于 2014-04-29 21:57:46

你可以直接使用moped ( mongoid使用的ruby适配器)来完成这个操作和其他复杂的原子操作,这些操作都是你想在一个查询中实现的:

代码语言:javascript
复制
SomeModel.collection.find("_id" => "foo").update({
            '$inc' => {"foo" => 1},
            '$push' => {"bar" => "b"}})
票数 1
EN

Stack Overflow用户

发布于 2013-12-04 08:32:55

我不知道你说的原子是什么意思?永恒的,没有验证的?

代码语言:javascript
复制
your_model.inc_field = your_model.inc_field + inc_value
your_model.push_field << pushable
your_model.timeless.save(validate: false)

附注: Mongoid、incpush (以及几乎所有其他原子操作)至少有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

票数 0
EN

Stack Overflow用户

发布于 2013-12-04 06:43:50

我不是红宝石专家,但也许你可以用find_and_modify

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20360956

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档