MongoDB:删除/合并重复文档的策略

时间:2016-10-21 10:11:21

标签: mongodb merge duplicates

情况:

让我们考虑一下我们有一个很大的应用程序,其中包含一个带联系人的地址簿。该应用程序的很大一部分保存了对这些联系人的引用。

问题:

现在地址簿包含大量重复的联系人(其中Contact AContact B具有相同的nameaddress,但电话号码不同,或者有一个在名称中键入错误等。)

在应用程序中使用了Contact AContact B,尽管在DB中保存了对它们的引用。这就是为什么我们不能简单地删除其中一个并扔掉它的ID。

当用户现在搜索联系人时,他无法确定哪一个是正确的选择。

问题:

处理此问题的最佳/最简单/最快的解决方案是什么?

思路:

  1. 基本且干净的解决方案:合并数据:Contact A -> Contact B。然后更新整个数据库,并将Contact A ID替换为Contact B ID。之后Contact A可以安全删除。 这种方式可能需要花费很多时间,而且你必须编写大量代码。

  2. 两个查询解决方案:合并数据。将字段replaces添加到Contact B,其中包含Contact A的ID。然后删除Contact A。当有联系人引用时,它执行的查询将首先查找_id = ...,然后查看replaces = ...。如果第二个查询成功,那么我们应该使用正确的ID更新引用。 这样我们需要创建一个额外的索引。

  3. 两个查询解决方案反向:这类似于 2。:合并数据。将字段replacedBy添加到Contact A。当查询返回包含replacedBy字段的联系人时,我们必须执行另一个查询以获取正确的联系人,然后替换该引用。 这样我们永远不会删除Contact A,因为我们无法确定所有这些引用何时更新。

  4. 只需隐藏旧/错误条目:合并数据。并向旧/错联系人添加一些deleted = true字段。这样它就不会出现在地址簿中。 引用仍然会显示旧/错误的数据。

  5. 理想情况下,_id使用ObjectId s,数组,据我所知,MongoDB不支持这种数组。

    请分享您的想法,优点和缺点。

    也许你有另一个解决方案,那就是更好/更快/更有效/更优雅的事件。

0 个答案:

没有答案