首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Mongoid不通过.create覆盖现有文档。

Mongoid不通过.create覆盖现有文档。
EN

Stack Overflow用户
提问于 2013-09-20 06:52:58
回答 2查看 731关注 0票数 0

我有以下课程:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Magazine
  include Mongoid::Document

  field :name
  field :count
  field :_id, default: -> { name }

我通过Magazine.create!(name: "Yolo", count: 2)创建这种类型的新文档。这个很好用。现在,当我想在MongoDB中更新这个文档时,因为计数发生了变化,我认为这样做是可行的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Magazine.create!(name: "Yolo", count: 42)

名称映射到相同的标识符,因此文档会被覆盖。虽然看起来操作是成功的,但是在MongoDB中,文档没有被更新。

相反,我不得不这样做:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Magazine.where(name: "Yolo").first.update_attributes!(count: 42)

这是可行的,但是有人能解释为什么我的第一种方法不能工作,如果我的第二种方法是通过Mongoid更新文档的常用方法?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-09-20 09:27:13

这个问题在我的机器上反复出现,我找到了解决办法。

根据Model#create!文档,如果发生验证错误,而不是数据库错误,则会引发错误。所以这不是你问题的解决方案。

http://mongoid.org/en/mongoid/docs/persistence.html#custom with(safe: true)可以告诉Mongoid引发司机骑着脚踏车中定义的数据库错误。在你的案子里。该错误看起来如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1.9.3-p0 :009 > Magazine.with(safe: true).create!(name: "Yolo", count: 42)
Moped::Errors::OperationFailure: The operation: #<Moped::Protocol::Command
  @length=71
  @request_id=7
  @response_to=0
  @op_code=2004
  @flags=[]
  @full_collection_name="mongoid.$cmd"
  @skip=0
  @limit=-1
  @selector={:getlasterror=>1, :safe=>true}
  @fields=nil>
failed with error 11000: "E11000 duplicate key error index: mongoid.magazines.$_id_  dup key: { : \"Yolo\" }"

此外,可以将安全模式设置为配置YAML中的默认模式,如文档中所述。

也许您希望找到一本带有Magazine.find("Yolo")的杂志来使用默认情况下由MongoDB创建的_id索引。即使_idname相同,Mongoid也不够聪明,无法使用_id查找文档。

票数 2
EN

Stack Overflow用户

发布于 2013-09-20 07:05:31

我想我有点惊讶你的第二个电话创造!不会引起错误。

尝试使用find方法与update相结合,这是用于更新属性的一个非常常见的一行:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Magazine.find('Yolo').update_attributes(count: 42)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18919783

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文