2

我在 couchdb 中有文件。架构如下所示:

userId
email
personal_blog_url
telephone

我假设两个用户实际上是同一个人,只要他们有

  • 电子邮件或
  • 个人博客网址或
  • 电话

相同。

我创建了 3 个视图,它们基本上将 email/blog_url/telephone 映射到 userIds,然后将 userIds 组合到同一键下的组中,例如,

_view/by_email:
----------------------------------
key                   values     
a_email@gmail.com    [123, 345]
b_email@gmail.com    [23, 45, 333]

_view/by_blog_url:
----------------------------------
key                   values     
http://myblog.com    [23, 45]
http://mysite.com/ss [2, 123, 345]

_view/by_telephone:
----------------------------------
key                   values     
232-932-9088          [2, 123]
000-111-9999          [45, 1234]
999-999-0000          [1]

我的问题:

  • 如何将 3 个不同视图的结果合并到不包含重复项的最终用户表/视图中?
  • 或者在 couchdb 中进行这种重复数据删除是否是一种好习惯?
  • 或者什么是在沙发上进行重复数据删除的好方法?

附言。在最终视图中,假设对于所有受骗者,我们只保留最小的 userId。

谢谢。

4

2 回答 2

2

好问题。也许您可以在您建议的视图中收听_changes并搜索您希望对真实用户唯一的字段 ( by_*)。

  • 将视图合并为一个(在一张地图中发出不同的字段):

    函数 (doc) { if (!doc.email || !doc.personal_blog_url || !doc.telephone) 返回;发射([1,doc.email],[doc._id]);发射([2,doc.personal_blog_url],[doc._id]);发射([3,doc.telephone],[doc._id]);}

  • 在reduce中合并id列表

  • 当更改提要中的新文档到达时,您可以查询视图keys=[[1, email], [2, personal_blog_url], ...]并合并三个列表。如果其最小 id 小于更改后的 doc,则更新 field realId,否则使用更改后的 id 更新列表中的文档。

我建议使用不同的文档来存储{ userId, realId }关系。

于 2012-10-22T22:39:23.997 回答
1

您不能仅使用视图来创建新文档。您需要某种任务来进行实际的合并。

这是一个想法。

您可以创建一个视图(如果数据存在则索引数据),而不是创建 3 个视图:

Key                             Values
---                             ------
[userId, 'phone']               777-555-1212
[userId, 'email']               username@example.com
[userId, 'url']                 favorite.url.example.com

除了原始值之外,我不会存储任何其他内容,因为您最终会得到大量不必要的数据重复(例如,如果您存储了完整的对象)。

然后,要查询,您可以执行以下操作:

...startkey=[userId]&endkey=[userId,{}]

这将为您提供所有重复信息作为该用户 ID 的一系列文档。您仍然需要对其进行解析以查看是否存在重复项。但是,通过这种方式,结果将很好地合并到单个 CouchDB 调用中。

这是在 StackOverflow 上使用数组作为键的一个很好的例子。

如果原始“用户”文档包含不属于重复数据删除过程的其他数据,您仍然可能会加载它。

一旦发现,您可以考虑即时清理数据,并防止在将新数据输入应用程序时出现新的重复数据。

于 2012-10-22T19:15:01.993 回答