例如,如果我们正在使用Google Analytics记录page_type,item_id,日期,综合浏览量,timeOnPage。
似乎有几种方法可以避免它。有自动方式吗?
在唯一标识记录的字段上创建索引,例如[page_type, item_id, date]
并使索引唯一,这样在添加相同记录时,它将拒绝它。
或者,如果数据库或框架支持,则使上面的主索引是唯一的。在Rails中,通常ID 1,2,3,4是主要索引。
或使用[page_type, item_id, date]
查询记录,然后更新该记录(如果已存在)(或者如果pageviews和timeOnPage已经具有相同的值,则不执行任何操作)。如果记录不存在,则插入包含此数据的新记录。但是如果需要以这种方式查询记录,看起来我们还需要这3个字段的索引。
始终插入新记录,但在查询值时,请使用
之类的内容select * from analytics where ... order by created_at desc limit 1
即获取最新创建的记录并忽略其余记录。但这似乎是1条记录的解决方案,但在汇总值(进行聚合)时却不太可行,例如select sum(pageviews)
或select count(*)
。
除了使用上述方法之外,还有一些自动解决方案吗?
答案 0 :(得分:4)
健
你的第一个选择似乎对我有用。最简单的方法。 Mongo默认支持此功能。
在插入时,它将检查唯一组合,如果存在,它将忽略插入并在服务器日志中写入“E11000重复键错误索引”消息。否则它将继续正常插入。
但似乎这在批量插入的情况下不起作用。如果有任何重复,整个批次将失败。快速谷歌搜索显示现有的mongo bug报告jira ticket。它还是开放的。
答案 1 :(得分:1)
我不能代表Mongoid / MongoDB,但是如果你想在关系数据库中强制执行唯一性约束,你应该创建一个uniqueness constraint。这就是他们的目的!在MySQL中,这相当于一个唯一索引;您可以将其指定为CONSTRAINT ... UNIQUE (col1, col2)
,但无论如何这只会创建一个唯一的索引。