Mongoid添加字段但在mongodb中不存在

时间:2014-01-09 06:18:04

标签: mongodb mongoid

我使用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') }"

任何人都可以告诉我为什么?

3 个答案:

答案 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?方法。因此导致此错误。