0

在我的应用程序中,我有多个包含username和的记录domain。以前,我曾经在version字段中具有不同值时保留所有记录,但现在我只想用一个版本替换它们。

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

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

并在有新版本时不断更新。

现在我只想拥有一个替换所有现有文档的记录。每当编辑具有新版本的新文档时upsert,所有匹配用户名和域的记录都将消失并合并到新的记录中。

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

4

2 回答 2

1

如果您不关心保留哪一个重复项,则可以通过在两个字段上创建唯一索引并dropDups: true在调用时指定选项来做到这一点,ensureIndex如下所示:

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

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

于 2013-09-10T02:21:29.880 回答
1

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

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

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