如何用MongoDB中的一条记录替换所有现有记录

时间:2013-09-10 00:38:42

标签: mongodb database

在我的应用程序中,我有多条包含usernamedomain的记录。 以前,我曾经在version字段中保留所有记录时保留所有记录,但现在我想用一个版本替换所有记录。

例如,我的设备集合结构为:

{
    username: me,
    domain: stackoverflow.com,
    version: 1
}
{
    username: me,
    domain: stackoverflow.com,
    version: 2
}

无论什么时候有新版本,都要继续保持。

现在我想只有一条记录替换所有现有文档。每当新版本的新文档被upsert编辑时,与用户名和域名匹配的所有记录都将被删除并合并到新版本中。

我尝试了upsert: truemulti: true选项,但它没有删除旧记录。 任何帮助都会很棒。

2 个答案:

答案 0 :(得分:1)

Upsert不会删除旧记录。它只能替换或创建新的。 (documentation for upsert

您需要手动清理旧数据。有几个选择:

  1. 等到你遇到之前的文件的新version,并在保存新版本之前删除所有版本。 (清理旧的,然后放下新的)。
  2. 使用聚合框架对usernamedomain进行分组,以返回所有组合的列表。然后,对于每个组合,删除除最新之外的所有组合(您可以在version上排序以获得最高值,然后执行查询,其中使用$ne删除除最高版本号之外的所有内容。虽然这会严重影响您的数据库,但您只需要执行一次。
  3. 使用您喜欢的编程语言手动过滤数据,并将数据移动到新的集合中。再说一遍,慢,但你只做一次。

答案 1 :(得分:1)

如果您不关心保留哪一个重复项,可以通过在两个字段上创建唯一索引来执行此操作,并在调用ensureIndex时指定dropDups: true选项,如下所示:< / p>

db.device.ensureIndex({username: 1, domain: 1}, {unique: true, dropDups: true})

这将迫使MongoDB通过删除具有重复值的文档来创建唯一索引,只留下每个用户名/域配对中的一个(这似乎正是您正在寻找的)。