为什么MongoDB可以创建唯一索引,但Mongoid不能?

时间:2010-09-15 23:56:06

标签: mongodb mongoid

在MongoDB shell中,如果我执行以下操作,则会创建索引,并且还会阻止插入重复记录:

db.analytics.ensureIndex({page: 1, some_id: 1, ga_date: -1}, {unique: true});

但我认为Mongoid可以这样做: http://mongoid.org/docs/indexing/

所以我有:

class PageAnalytic < Analytic
  include Mongoid::Document
  field :page, :type => String
  field :some_id, :type => Integer
  field :ga_date, :type => Time
  field :pageviews, :type => Integer
  field :timeOnPage, :type => Integer
  index(
    [
      [ :page, Mongo::ASCENDING ],
      [ :some_id, Mongo::ASCENDING ],
      [ :ga_date, Mongo::DESCENDING ]
    ],
    :unique => true
  )
end

并做一个

rake db:create_indexes

但是,仍然可以插入重复的记录吗?

更新:这很奇怪,但是我在MongoDB shell中添加了索引并删除了集合,然后在MongoDB Shell或Mongoid中重新创建了索引,现在我可以放弃在MongoDB shell中收集,然后rake创建索引,并使用mongoid两次添加相同的文档,mongod会说重复键的错误。

2 个答案:

答案 0 :(得分:7)

您是否使用常规方式保存模型?喜欢:

page_analyitc.save

如果您使用这种方式保存模型,mongoid将不会给出任何错误消息。(如果在mongodb上有重复的密钥)

所以正确的方法是使用:

page_analyitc.safely.save

会引发错误,如:

  

Mongo :: OperationFailure:11001:E11001   更新时重复密钥

希望这些信息能为您提供帮助。

答案 1 :(得分:0)

在文档中添加index时,mongoid不会自动创建任何索引。要创建索引,您需要运行rake任务rake db:mongoid:create_indexes,就像在新文档http://mongoid.org/en/mongoid/docs/indexing.html中看到的那样。