我在MongoDB有一个Collection ,那里有大约300万张唱片.我的样本记录看起来,

 { "_id" = ObjectId("50731xxxxxxxxxxxxxxxxxxxx"),
   "source_references" : [
                           "_id" : ObjectId("5045xxxxxxxxxxxxxx"),
                           "name" : "xxx",
                           "key" : 123
                          ]
 }

我在Collection 中有很多重复的记录,都有相同的source_references.key条.(我指的是source_references.key而不是_id).

我想删除基于source_references.key的重复记录,我正在考虑编写一些PHP代码来遍历每个记录,如果存在,则删除该记录.

有没有办法删除Mongo内部命令行中的重复项?

推荐答案

This answer is obsolete : the dropDups option was removed in MongoDB 3.0, so a different approach will be required in most cases. For example, you could use aggregation as suggested on: MongoDB duplicate documents even after adding unique key.

如果您确定source_references.key标识了重复记录,则可以使用MongoDB 2.6或更高版本中的dropDups:true索引创建选项确保索引唯一:

db.things.ensureIndex({'source_references.key' : 1}, {unique : true, dropDups : true})

这将为每source_references.key个值保留第一个唯一文档,并删除任何可能导致重复密钥冲突的后续文档.

Important Note:任何缺少source_references.key字段的文档都将被视为具有null值,因此缺少键字段的后续文档将被删除.您可以添加sparse:true索引创建选项,以便索引仅适用于具有source_references.key字段的文档.

Obvious caution:对数据库进行备份,如果担心意外数据丢失,请先在登台环境中try .

Mongodb相关问答推荐

用其他集合中的文档替换嵌套文档数组中的值

如何填充Mongoose中的嵌套引用

MongoDB - 将对象转换为数组

如何更新mongo中列表最后一个对象的属性

在 MongoDB 中加入多个集合

如何过滤查找mongodb的结果

MongoDB聚合 - 用另一个数组过滤数组

连接到远程 mongo 服务器导致异常连接失败

聚合/元素子文档作为 mongo 中的顶级文档

使用 Spring Boot >= 2.0.1.RELEASE 将 ZonedDateTime 保存到 MongoDB 时出现 CodecConfigurationException

将MongoDB连接到前端?

在mongodb中实现分页

如何在 $lookup Mongodb 的 LocalField 中将字符串转换为 objectId

mongodb无法启动

在 MongoDB 中按条件分组

在 MongoDB 中为现有用户更改密码

无法连接到远程服务器上的 mongo

MongoDB 连接字符串到副本集

使用 C# 聚合 $lookup

使用 Mongoose ORM 的杀手锏是什么?