Dedupe MongoDB Collection

时间:2012-02-14 00:29:28

标签: mongodb duplicates nosql

我是NoSQL的新手,对不起,如果这是非常基本的话。假设我有以下集合:

{
    a: 1,
    b: 2,
    c: 'x'
},
{
    a: 1,
    b: 2,
    c: 'y'
},
{
    a: 1,
    b: 1,
    c: 'y'
}

我想对匹配的任何内容运行“重复数据删除”查询:

{
    a: 1,
    b: 2
    ... (any other properties are ignored) ...
},

因此,在运行查询后,集合中剩余的任何一个都可以正常:

{
    a: 1,
    b: 2,
    c: 'y'
},
{
    a: 1,
    b: 1,
    c: 'y'
}

OR

{
    a: 1,
    b: 2,
    c: 'x'
},
{
    a: 1,
    b: 1,
    c: 'y'
}

只要只有一个文档的== 1且b == 2,

3 个答案:

答案 0 :(得分:6)

如果您始终希望确保只有一个文档具有任何给定的ab组合,则可以在ab上使用唯一索引。创建索引时,您可以提供dropDups选项,该选项将删除除一个副本之外的所有内容:

db.collection.ensureIndex({a: 1, b: 1}, {unique: true, dropDups: true})

答案 1 :(得分:0)

我不知道任何可以就地更新您的收藏的命令,但您当然可以通过临时存储来完成。

  1. 按照您的条件(字段ab
  2. 对文档进行分组
  3. 每组挑选任何文件。将其保存到临时集合tmp。弃掉小组的其他成员。
  4. 使用tmp
  5. 中的文档覆盖原始集合

    您可以使用MapReduce或即将发布的Aggregation Framework(目前处于不稳定的分支中)执行此操作。

    我决定不在这里编写代码,因为它会带走远离你的快乐。 :)

答案 2 :(得分:0)

此答案已有一段时间没有更新。我花了一段时间才弄清楚这一点。首先,使用Mongo CLI,连接到数据库并在要唯一的字段上创建索引。这是users具有唯一电子邮件地址的示例:

db.users.createIndex({ "email": 1 }, { unique: true })

1会创建索引,并自动创建现有的_id索引。

现在,当您在某个对象上运行createsave时,如果该电子邮件存在,Mongoose将遇到重复错误。