11

MongoDB シェルで次の操作を行うと、インデックスが作成され、重複レコードが挿入されなくなります。

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 シェルでインデックスを追加してコレクションを削除し、MongoDB シェルまたは Mongoid でインデックスを再作成した後、MongoDB シェルでコレクションを削除してから、rake を作成できます。インデックスを作成し、mongoid を使用して同じドキュメントを 2 回追加すると、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と、mongoid は自動的にインデックスを作成しません。rake db:mongoid:create_indexesインデックスを作成するには、新しいドキュメントhttp://mongoid.org/en/mongoid/docs/indexing.htmlにあるように rake タスクを実行する必要があります。

于 2013-06-04T13:28:19.747 に答える