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

如何在MongoDB中用一条记录替换所有现有记录,mongodb,database,Mongodb,Database,在我的应用程序中,我有多个包含用户名和域的记录。 以前,当所有记录在version字段中的值不同时,我会保留所有记录,但现在我只想用一个版本来替换它们 例如,我有一个设备集合,其结构如下: { username: me, domain: stackoverflow.com, version: 1 } { username: me, domain: stackoverflow.com, version: 2 } 只要有新版本,就会不断升级 现在我只

在我的应用程序中,我有多个包含
用户名
的记录。 以前,当所有记录在
version
字段中的值不同时,我会保留所有记录,但现在我只想用一个版本来替换它们

例如,我有一个设备集合,其结构如下:

{
    username: me,
    domain: stackoverflow.com,
    version: 1
}
{
    username: me,
    domain: stackoverflow.com,
    version: 2
}
只要有新版本,就会不断升级

现在我只希望有一个记录来替换所有现有的文档。每当使用新版本的新文档插入时,匹配用户名和域的所有记录都将消失并合并到新文档中

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

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

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

  • 等待遇到以前可能是文档的新
    版本
    ,并在保存新版本之前删除所有版本。(清理旧的,然后放下新的)
  • 使用聚合框架对
    用户名
    进行分组,以返回所有组合的列表。然后,对于每个组合,除去最新的(您可以按
    版本
    排序以获得最高版本,然后执行查询,使用
    $ne
    删除除最高版本号以外的所有匹配项)。虽然这会严重影响数据库,但您只需执行一次
  • 使用您喜爱的编程语言手动筛选数据,并将数据移动到新集合。再说一次,慢一点,但你只会做一次

  • 如果不关心保留哪一个副本,可以通过在两个字段上创建唯一索引来实现,并在调用
    ensureIndex
    时指定选项,如下所示:

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

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

    我还认为这是唯一的方法。干杯!:)这似乎正是我要找的。谢谢你的回答!