当集合中没有唯一键时,如何从 mongodb 中删除重复项。?

How to remove duplicate from mongodb when there is not unique key in collection.?

如果没有唯一元素,我应该如何从 mongodb 集合中删除重复项?

我想在使用 Java 驱动程序时执行此操作。 在下面的图片中,一些记录是相同的。我想删除该记录。时间在这里不是唯一键。

P.S.: 我只是以 table 形式呈现数据。实际上有json数组形式。

我想你在这里有 2 个选择:

  1. 将您的 JSON 数组解析为 List,根据时间戳对其进行排序,比较列表中的条目并删除具有重复时间戳(和 IP 地址?)的项目。这也可以使用 HashSet 如果您使用适当的键,您不必自己做任何 sorting/comparing,当键已经存在时 HashSet 不会添加对象.
  2. 如果您可以控制 JSON 数组的来源,请确保它不会在同一秒内两次输出相同的事件。或者更好的是,提供更准确的时间戳,包括毫秒。我不知道这些事件是什么意思,但可能在 1 秒内从 1 台设备引发了 2 个(或更多)这些事件。通过删除 JSON 数组中的重复项,您无法知道这已经发生。不过,这完全取决于您的软件要求。

我同意这里其他用户的观点,他们指出重复文档的存在可能表明您的应用程序存在一些问题,在插入重复文档之前消除它们比稍后尝试清理它们要好。您应该确保重复项确实没有意义,并尝试确定它们的来源,这比清理它们具有更高的优先级。

也就是说,这里"duplicate"的意思好像是"the value of every single field (except _id) is the same"。因此,为了消除重复项,我会执行以下操作:

1 遍历集合中的每个文档,可能使用 parallel collection scan

并行

2 计算所有非_id 字段的散列

3 将文档插入代表一组重复项的另一个集合中

{
    "_id" : #hash#,
    "docs" : [#array of _ids of docs],
    "count" : #number of _ids in docs array#
}

然后您将拥有所有重复项的记录,并且您可以遍历此集合并删除除一个重复项之外的所有重复项,对于具有 count > 1 的每个文档。或者,如果您不想费心记录重复项,您可以插入一个散列为 _id 的文档,并且每当出现散列冲突时,删除当前文档,因为它是重复的(与高概率)。