Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何避免相同的记录在MongoDB(使用Mongoid)或ActiveRecord(Rails使用MySQL)中插入两次?_Sql_Mysql_Mongodb_Rdbms_Mongoid - Fatal编程技术网

如何避免相同的记录在MongoDB(使用Mongoid)或ActiveRecord(Rails使用MySQL)中插入两次?

如何避免相同的记录在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

例如,如果我们正在进行分析,记录页面类型、项目id、日期、页面视图、timeOnPage

似乎有几种方法可以避免它。有自动方式吗

  • 在唯一标识记录的字段上创建索引,例如
    [page\u type,item\u id,date]
    ,并使索引唯一,以便在添加同一记录时,它将拒绝该记录

  • 或者,如果DB或框架支持,则将上面的作为唯一的主索引。不过,在Rails中,通常ID1、2、3、4是主索引

  • 或者,使用
    [页面类型,项目id,日期]
    查询记录,然后如果该记录已经存在,则更新该记录(或者如果pageviews和timeOnPage已经具有相同的值,则不执行任何操作)。如果记录不存在,则插入包含此数据的新记录。但是如果需要以这种方式查询记录,看起来我们需要在这3个字段上建立索引

  • 始终插入新记录,但在查询值时,请使用

    select * from analytics  where ...  order by created_at desc limit 1
    
  • 也就是说,获取最新创建的记录并忽略其余记录。但这似乎是一个针对1条记录的解决方案,但在对值求和(进行聚合)时却不太可行,例如
    selectsum(pageviews)
    selectcount(*)


    除了使用上述方法之外,还有一些自动解决方案吗?

    我不能说Mongoid/MongoDB,但如果您希望在关系数据库中强制实施唯一性约束,则应该创建一个。这就是他们在那里的目的!在MySQL中,这相当于一个唯一的索引;您可以将其指定为
    约束。。。UNIQUE(col1,col2)
    ,但这只会创建一个唯一的索引。

    我觉得你的第一个选择是可行的。最简单的方法。默认情况下,Mongo支持此功能

    插入时,它将检查唯一组合,如果存在,它将忽略插入并在服务器日志中写入“E11000重复密钥错误索引”消息。否则将继续正常插入

    但在批量插入的情况下,这似乎不起作用。如果存在任何重复项,则整个批次将失败。快速谷歌搜索显示了现有的mongo bug报告jira。它还开着