【问题标题】:How to remove duplicate from mongodb when there is not unique key in collection.?当集合中没有唯一键时如何从 mongodb 中删除重复项。?
【发布时间】:2015-04-07 11:14:31
【问题描述】:

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

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

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

【问题讨论】:

  • 决定两条记录是否相同的不是key,而是其他字段的内容。
  • 我知道。我应该如何删除重复项?
  • 您应该在写入数据库之前编写验证重复的代码。
  • 所以你的意思是现在在 mongodb 中有解决方案。
  • 我说没有这样的事情。我只是说“预防”比“解决”问题更好。我自己不熟悉 mongodb,但最有可能的是,删除记录是可能的。但是你应该问自己:你想每天晚上检查表,手动检查是否有重复记录,然后手动删除它们吗?

标签: java mongodb mongodb-query mongo-java


【解决方案1】:

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

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

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 的文档,并且每当出现哈希冲突时,删除当前文档,因为它是重复的(很有可能)。

【讨论】:

  • 虽然我完全同意您的方法(添加 ID 让事情变得非常容易),但这意味着 OP 可以控制生成 JSON 提要的软件。如果是这种情况,在生成提要之前过滤掉重复项会更容易(也更好)。如果它确实涉及数百万条记录,则您不想遍历整个数组来检查重复项,因为这可能会占用相当多的时间和资源。
【解决方案2】:

我认为你有两个选择:

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

【讨论】:

  • Stefan:没有key,行是否相同,不是基于key中的信息,而是所有字段。
  • 我知道,我会说 OP 必须创建自己的唯一键,以便他可以使用该键过滤重复值。
  • 在我看来,尝试使用不包含重复对象的列表或集合会更好。为它编写一个添加的密钥可能会占用大量内存,因为它必须包含所有信息,并且如果做得不够深入,可能容易出错
  • Seems to me it would be better trying to use a list or set which doesn't takes duplicate objects. 这就是我的建议。使用MapSet 是另一种可供OP 测试的方法。我同意它可能容易出错。
  • 是的,但我从你的解释中了解到,他应该基于一切创建一个密钥。我认为最好有equals方法来验证其中是否已经有一个toAdd对象的double。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-21
  • 2015-06-07
  • 2018-04-02
  • 2021-07-10
  • 2018-08-08
  • 2011-12-13
  • 2018-07-07
相关资源
最近更新 更多