我有以下课程:
class Magazine
include Mongoid::Document
field :name
field :count
field :_id, default: -> { name }
我通过Magazine.create!(name: "Yolo", count: 2)
创建这种类型的新文档。这个很好用。现在,当我想在MongoDB中更新这个文档时,因为计数发生了变化,我认为这样做是可行的:
Magazine.create!(name: "Yolo", count: 42)
名称映射到相同的标识符,因此文档会被覆盖。虽然看起来操作是成功的,但是在MongoDB中,文档没有被更新。
相反,我不得不这样做:
Magazine.where(name: "Yolo").first.update_attributes!(count: 42)
这是可行的,但是有人能解释为什么我的第一种方法不能工作,如果我的第二种方法是通过Mongoid更新文档的常用方法?
发布于 2013-09-20 09:27:13
这个问题在我的机器上反复出现,我找到了解决办法。
根据Model#create!
或文档,如果发生验证错误,而不是数据库错误,则会引发错误。所以这不是你问题的解决方案。
http://mongoid.org/en/mongoid/docs/persistence.html#custom with(safe: true)
可以告诉Mongoid引发司机骑着脚踏车中定义的数据库错误。在你的案子里。该错误看起来如下:
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
索引。即使_id
与name
相同,Mongoid也不够聪明,无法使用_id
查找文档。
发布于 2013-09-20 07:05:31
我想我有点惊讶你的第二个电话创造!不会引起错误。
尝试使用find方法与update相结合,这是用于更新属性的一个非常常见的一行:
Magazine.find('Yolo').update_attributes(count: 42)
https://stackoverflow.com/questions/18919783
复制相似问题