3

例如,如果我们正在做 Analytics 记录 page_type、item_id、date、pageviews、timeOnPage。

似乎它们有几种避免它的方法。有自动的方法吗?

  1. 在唯一标识记录的字段上创建索引,例如 [page_type, item_id, date]并使索引唯一,这样在添加相同的记录时,它会拒绝它。

  2. 或者,如果数据库或框架支持,则将上述设置为唯一的主索引。不过,在 Rails 中,通常 ID 1、2、3、4 是主索引。

  3. 或者,使用 查询记录[page_type, item_id, date],然后更新该记录(如果它已经存在)(或者如果 pageviews 和 timeOnPage 已经具有相同的值,则不执行任何操作)。如果记录不存在,则使用此数据插入一条新记录。但是如果需要以这种方式查询记录,看起来我们无论如何都需要在这三个字段上建立索引。

  4. 一直插入新记录,但是在查询值时,使用类似

    select * from analytics  where ...  order by created_at desc limit 1
    

也就是说,获取最新创建的记录并忽略其余记录。但这似乎是 1 条记录的解决方案,但在汇总值(进行聚合)时不太可行,例如select sum(pageviews)or select count(*)

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

4

2 回答 2

4

简,

你的第一个选择对我来说似乎可行。和最简单的方法。Mongo 默认支持此功能。

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

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

于 2010-09-15T04:17:37.967 回答
1

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

于 2010-09-15T02:51:42.227 回答