如何避免相同的记录在MongoDB(使用Mongoid)或ActiveRecord(Rails使用MySQL)中插入两次?
例如,如果我们正在进行分析,记录页面类型、项目id、日期、页面视图、timeOnPage 似乎有几种方法可以避免它。有自动方式吗如何避免相同的记录在MongoDB(使用Mongoid)或ActiveRecord(Rails使用MySQL)中插入两次?,sql,mysql,mongodb,rdbms,mongoid,Sql,Mysql,Mongodb,Rdbms,Mongoid,例如,如果我们正在进行分析,记录页面类型、项目id、日期、页面视图、timeOnPage 似乎有几种方法可以避免它。有自动方式吗 在唯一标识记录的字段上创建索引,例如[page\u type,item\u id,date],并使索引唯一,以便在添加同一记录时,它将拒绝该记录 或者,如果DB或框架支持,则将上面的作为唯一的主索引。不过,在Rails中,通常ID1、2、3、4是主索引 或者,使用[页面类型,项目id,日期]查询记录,然后如果该记录已经存在,则更新该记录(或者如果pageviews和t
[page\u type,item\u id,date]
,并使索引唯一,以便在添加同一记录时,它将拒绝该记录[页面类型,项目id,日期]
查询记录,然后如果该记录已经存在,则更新该记录(或者如果pageviews和timeOnPage已经具有相同的值,则不执行任何操作)。如果记录不存在,则插入包含此数据的新记录。但是如果需要以这种方式查询记录,看起来我们需要在这3个字段上建立索引select * from analytics where ... order by created_at desc limit 1
selectsum(pageviews)
或selectcount(*)
除了使用上述方法之外,还有一些自动解决方案吗?我不能说Mongoid/MongoDB,但如果您希望在关系数据库中强制实施唯一性约束,则应该创建一个。这就是他们在那里的目的!在MySQL中,这相当于一个唯一的索引;您可以将其指定为
约束。。。UNIQUE(col1,col2)
,但这只会创建一个唯一的索引。
我觉得你的第一个选择是可行的。最简单的方法。默认情况下,Mongo支持此功能
插入时,它将检查唯一组合,如果存在,它将忽略插入并在服务器日志中写入“E11000重复密钥错误索引”消息。否则将继续正常插入
但在批量插入的情况下,这似乎不起作用。如果存在任何重复项,则整个批次将失败。快速谷歌搜索显示了现有的mongo bug报告jira。它还开着