mongodb - 为什么 MongoDB 可以创建唯一索引而 Mongoid 不能?

在 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会提示重复键错误。

最佳答案

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

page_analyitc.save

如果你用这种方式保存模型,mongoid不会报任何错误信息。(如果mongodb上有重复的key)

所以正确的做法是使用:

page_analyitc.safely.save

它会引发如下错误:

Mongo::OperationFailure: 11001: E11001 duplicate key on update

希望这些信息对您有所帮助。

https://stackoverflow.com/questions/3722746/

相关文章:

node.js - 在 docker 容器中安装 Mongoose

mysql - 在备份期间保持两个独立数据存储之间的完整性(MySQL 和 MongoDB)

javascript - 如何处理 MongoDB 键名中的点?

java - Spring数据mongodb审计不起作用..(Java配置)

node.js - mongodb错误: The 'cursor' option is requir

mongodb - 为什么 Spring Data MongoDB 无法实例化这种嵌套类型结构?

php - 如何在 Waterline 或 MongoDB 中选择、分组和加入

php - 查询 1000 万个 mongodb 文档

ruby-on-rails - 通过 AWS opsworks 设置 mongodb

mongodb - 复合索引可以服务多个查询吗