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

时间:2015-04-07 11:14:32

标签: java mongodb mongodb-query mongo-java

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

我想在使用Java驱动程序时这样做。 在下面的图片中,一些记录是相同的。我想删除那些记录。时间不是这里唯一的关键。

enter image description here

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

2 个答案:

答案 0 :(得分:0)

我认为你有两个选择:

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

答案 1 :(得分:0)

我同意其他用户的意见,他们指出,重复文档的存在可能表明您的应用程序存在一些问题,并且在插入之前消除重复文件比尝试稍后清理它们更好。你应该确保副本真的没有意义,并尝试确定它们的来源,比清理它们更优先。

也就是说,“复制”的含义似乎是“每个字段的值(_id除外)是相同的”。因此,为了消除重复,我会做以下事情:

1使用parallel collection scan

迭代集合中的每个文档,可能并行

2计算所有非_id字段

的哈希值

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

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

然后您将拥有所有重复项的记录,并且您可以迭代此集合并删除除{1}}之外的所有重复项之外的所有重复项。或者,如果您不想费心保留重复记录,可以插入一个散列为count > 1的doc,并且每当发生哈希冲突时,删除当前文档,因为它是重复的(带有高概率)。