当集合中没有唯一键时,如何从 mongodb 中删除重复项。?
How to remove duplicate from mongodb when there is not unique key in collection.?
如果没有唯一元素,我应该如何从 mongodb 集合中删除重复项?
我想在使用 Java 驱动程序时执行此操作。
在下面的图片中,一些记录是相同的。我想删除该记录。时间在这里不是唯一键。
P.S.: 我只是以 table 形式呈现数据。实际上有json数组形式。
我想你在这里有 2 个选择:
- 将您的 JSON 数组解析为
List
,根据时间戳对其进行排序,比较列表中的条目并删除具有重复时间戳(和 IP 地址?)的项目。这也可以使用 HashSet
如果您使用适当的键,您不必自己做任何 sorting/comparing,当键已经存在时 HashSet
不会添加对象.
- 如果您可以控制 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
的文档,并且每当出现散列冲突时,删除当前文档,因为它是重复的(与高概率)。
如果没有唯一元素,我应该如何从 mongodb 集合中删除重复项?
我想在使用 Java 驱动程序时执行此操作。 在下面的图片中,一些记录是相同的。我想删除该记录。时间在这里不是唯一键。
P.S.: 我只是以 table 形式呈现数据。实际上有json数组形式。
我想你在这里有 2 个选择:
- 将您的 JSON 数组解析为
List
,根据时间戳对其进行排序,比较列表中的条目并删除具有重复时间戳(和 IP 地址?)的项目。这也可以使用HashSet
如果您使用适当的键,您不必自己做任何 sorting/comparing,当键已经存在时HashSet
不会添加对象. - 如果您可以控制 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
的文档,并且每当出现散列冲突时,删除当前文档,因为它是重复的(与高概率)。