Почему MongoDB может создать уникальный индекс, а Mongoid - нет? - PullRequest
11 голосов
/ 16 сентября 2010

В оболочке 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 для добавления одних и тех же документов дважды, а mongod сообщит об ошибке для дублированного ключа.

Ответы [ 2 ]

7 голосов
/ 27 апреля 2011

Вы использовали нормальный способ сохранить свою модель?Например:

page_analyitc.save

Если вы используете этот способ для сохранения модели, mongoid не выдаст сообщение об ошибке (если на mongodb есть дублирующий ключ)

Таким образом, правильный способ сделать это - использовать:

page_analyitc.safely.save

Это вызовет ошибку, такую ​​как:

Mongo :: OperationFailure: 11001: E11001дубликат ключа при обновлении

Надеюсь, эта информация поможет вам.

0 голосов
/ 04 июня 2013

Когда вы добавляете index в ваш документ, mongoid не будет автоматически создавать индекс. Чтобы создать индекс, вам нужно запустить задачу rake rake db:mongoid:create_indexes, как вы можете видеть в новых документах http://mongoid.org/en/mongoid/docs/indexing.html.

...