【问题标题】:Dedupe MongoDB Collection重复数据删除 MongoDB 集合
【发布时间】:2012-03-05 10:07:15
【问题描述】:

我是 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'
}

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

只要只剩下一个文档,a==1 和 b==2。

【问题讨论】:

    标签: mongodb duplicates nosql


    【解决方案1】:

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

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

    【讨论】:

    • 该死,忘记了:)
    • 这不适用于所有可能的情况(例如,删除 {a:{$in:[1,2]}} 的所有欺骗),但它是唯一的单一命令解决方案(尽管你会如果您实际上不需要索引,可能希望立即删除索引)
    • “3.0 版更改:dropDups 选项不再可用。”
    【解决方案2】:

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

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

    1 创建索引,同时自动创建现有的_id 索引。

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

    【讨论】:

      【解决方案3】:

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

      1. 按您的标准(字段ab)对文档进行分组
      2. 为每个组选择其中的任何文档。将其保存到临时集合tmp。丢弃该组的其他成员。
      3. 用来自tmp 的文档覆盖原始集合。

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

      我决定不在这里编写代码,因为这会让你失去学习的乐趣。 :)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-11-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多