在我的应用程序中,我有多条包含username
和domain
的记录。
以前,我曾经在version
字段中保留所有记录时保留所有记录,但现在我想用一个版本替换所有记录。
例如,我的设备集合结构为:
{
username: me,
domain: stackoverflow.com,
version: 1
}
{
username: me,
domain: stackoverflow.com,
version: 2
}
无论什么时候有新版本,都要继续保持。
现在我想只有一条记录替换所有现有文档。每当新版本的新文档被upsert
编辑时,与用户名和域名匹配的所有记录都将被删除并合并到新版本中。
我尝试了upsert: true
和multi: true
选项,但它没有删除旧记录。
任何帮助都会很棒。
答案 0 :(得分:1)
Upsert
不会删除旧记录。它只能替换或创建新的。 (documentation for upsert)
您需要手动清理旧数据。有几个选择:
version
,并在保存新版本之前删除所有版本。 (清理旧的,然后放下新的)。username
和domain
进行分组,以返回所有组合的列表。然后,对于每个组合,删除除最新之外的所有组合(您可以在version
上排序以获得最高值,然后执行查询,其中使用$ne
删除除最高版本号之外的所有内容。虽然这会严重影响您的数据库,但您只需要执行一次。答案 1 :(得分:1)
如果您不关心保留哪一个重复项,可以通过在两个字段上创建唯一索引来执行此操作,并在调用ensureIndex
时指定dropDups: true
选项,如下所示:< / p>
db.device.ensureIndex({username: 1, domain: 1}, {unique: true, dropDups: true})
这将迫使MongoDB通过删除具有重复值的文档来创建唯一索引,只留下每个用户名/域配对中的一个(这似乎正是您正在寻找的)。