在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会说重复键的错误。
答案 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中看到的那样。