【发布时间】:2011-03-08 02:17:48
【问题描述】:
如何在 couchdb 中进行子选择,或者如何使用 group_level 将超集键匹配到子集
我有一个非常复杂的问题,希望对不只是第一次学习 map/reduce 和 couchdb 的人有一个不太复杂的答案。
我正在开发一个系统,该系统向客户端提供 json 清单,以使用每天更新的内容对其自身进行配置。在第一次运行时,客户端使用一些描述性标签(例如:屏幕大小、操作系统、位置)注册自己,然后服务器返回一个 group_id。客户端每天使用该 ID 来请求其清单。在后端,我们任意将共享某些标签的客户端分组在一起,以减少我们需要存储/服务的唯一清单的数量。
我们的销售/管理员有一个网络应用程序,他可以在其中设置受众群体以针对特定群体的特定内容。一个受众可以重叠多个组。诀窍是,当客户报告以获得新的清单时,我们需要确定哪些受众最适合该客户的群体。最匹配的受众将是标签是提交组标签子集的第一个受众,例如:
观众1:标签A,标签B,标签C,标签D 观众2:标签A,标签C 组1:标签A,标签B,标签C该组应该匹配 Audience2,而不是 Audience1。
如果我们使用受众标签来查找最佳组匹配(换句话说,如果 group.tags 是 Audience.tags 的子集),我可以像这样构建一个非常有效的索引:
[tagA, tagB, tagC], group1._id [tagA, tagC, tagB], group1._id [tagB, tagA, tagC], group1._id [tagB, tagC, tagA], group1._id [tagC, tagA, tagB], group1._id [tagC, tagB, tagA], group1._id并使用 group_level=2 和 key=[tagA, tagC] 将 Audience2 与索引中的第二行匹配。问题是,我无法弄清楚如何从另一个方向进行此操作:将 group.tags 与 Audience.tags 的索引进行匹配,其中我们在查询时知道的标签 (group.tags) 是我们尝试匹配的标签(audience.tags)
我已经牢牢掌握了简单的 m/r 视图,但我一直在这个问题上遇到死胡同。我提出的每个解决方案都涉及在我的视图函数中进行某种子选择,这在 couchdb 视图中不起作用......关于如何解决这样的问题的任何想法?
希望这个描述有点道理。
【问题讨论】: