Почему MongoDB может создавать уникальный индекс, но Mongoid не может?
В оболочке MongoDB, если я делаю следующее, создается индекс, а также предотвращается вставка дублирующих записей:
db.analytics.ensureIndex({page: 1, some_id: 1, ga_date: -1}, {unique: true});
Но я думал, что Монгоид может сделать то же самое:
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 скажет ошибку для дублирующего ключа.
Ответы
Ответ 1
Вы использовали обычный способ сохранить свою модель? Например:
page_analyitc.save
Если вы используете этот способ для сохранения модели, mongoid не выдаст никакого сообщения об ошибке (если на mongodb есть дубликат)
Итак, правильный способ сделать это:
page_analyitc.safely.save
Появится сообщение об ошибке:
Mongo:: OperationFailure: 11001: E11001 дублирующий ключ при обновлении
Надеемся, что эта информация поможет вам.
Ответ 2
Когда вы добавляете index
в свой документ, mongoid не будет автоматически создавать какой-либо индекс. Чтобы создать индекс, вам нужно запустить команду rake rake db:mongoid:create_indexes
, как вы можете видеть в новых документах http://mongoid.org/en/mongoid/docs/indexing.html.