我使用Mongoid在rails项目中查询db。 当我向用户模型添加字段“范围”
时class User
include Mongoid::Document
field :scope, type: String
end
使用rails控制台时,我们可以发现此字段已添加到用户模型。
但是当我们去mongodb控制台查看用户数据时,使用db.users.find()
,它还没有范围字段。
当我想在rails控制台中更新范围字段时。它始终低于错误。
pry(main)> user = User.first
=> #<User _id: 521dcd4464fad29a74000009, scope: "private", xxx_id: "521dcd4464fad29a74000008">
pry(main)> user.update_attributes(scope: "public")
Moped::Errors::OperationFailure: The operation: #<Moped::Protocol::Command
@length=84
@request_id=17
@response_to=0
@op_code=2004
@flags=[]
@full_collection_name="blog_development.$cmd"
@skip=0
@limit=-1
@selector={:getlasterror=>1, :safe=>true}
@fields=nil>
failed with error 11000: "E11000 duplicate key error index: blog_development.users.$_id_ dup key: { : ObjectId('521dcd4464fad29a74000009') }"
任何人都可以告诉我为什么?
答案 0 :(得分:2)
将field :scope, type: String
添加到模型中不会将其添加到基础MongoDB集合中,这只会告诉Mongoid它应该允许模型为访问者,变更器,验证,质量提供scope
-assignment,...请记住,MongoDB集合中的不同文档可以具有完全不同的属性,因此模式实际上是Mongoid应用的虚构。
如果您希望所有users
都拥有scope
,那么您必须说出以下内容:
User.collection.find().update_all(:$set => { :scope => 'whatever it should be' })
手动将其添加到所有文档中。
答案 1 :(得分:0)
该字段存在于已保存的对象中。但是为了能够找到一个具有您要求值的值,您必须创建一个。
class User
include Mongoid::Document
field :name, type: String
field :age, type: Integer
end
User.find(name: 'John')
# => nil
User.create({ name: 'John', age: '18' })
# => User 284692 :name => 'John', :age => 18
User.find(name: 'John')
# => User 284692 :name => 'John', :age => 18
希望它有所帮助。
<击>
在'mu太短'之后编辑帖子:
要填充db中的所有现有对象,只需为字段提供:默认值
class User
field :name, type: String, default: 'Martin Dupont'
end
击> <击> 撞击>
答案 2 :(得分:0)
感谢您的回复。
原因是在这个模型中,我有覆盖new_record?
方法。因此导致此错误。