11

在 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 创建index,并使用 mongoid 两次添加相同的文档,mongod 会说重复键错误。

4

2 回答 2

7

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

page_analyitc.save

如果使用这种方式保存模型,mongoid 不会给出任何错误信息。(如果 mongodb 上有重复键)

所以正确的方法是使用:

page_analyitc.safely.save

它会引发如下错误:

Mongo::OperationFailure: 11001: E11001 更新时重复键

希望这些信息可以帮助到你。

于 2011-04-27T04:22:38.753 回答
0

当您index在文档中添加 a 时,mongoid 不会自动创建任何索引。为了创建索引,您需要运行 rake 任务,如您在新文档http://mongoid.org/en/mongoid/docs/indexing.htmlrake db:mongoid:create_indexes中所见。

于 2013-06-04T13:28:19.747 回答