MongoDB架构设计,Coalesce,将用户特定字段与默认字段合并

时间:2011-07-08 09:54:51

标签: sql mongodb join couchdb nosql

假设:

对象数据库,每个对象都有搜索顺序的默认权重(可能是普遍的受欢迎程度)。

当每个用户使用这些对象时,将为每个项目存储用户对搜索顺序的个人权重(使用任何算法,例如使用频率等)。

在SQL中,通过连接对象和user_objects表并按照

的方式执行某些操作非常容易。
select ... coalesce(user_objects.personal_weighting, objects.default_weighting) 
    as sort_key order_by sort_key

换句话说,用户可以搜索整个对象的数据库(比如说歌曲)。如果存在用户之前从未与之交互过的对象(他们从未收听过的歌曲),则该对象的搜索顺序加权基于为每个对象存储的默认值。如果用户与对象进行了交互,则该对象的搜索顺序加权基于特定用户的权重,超出默认值。

有没有有效的方法在MongoDB中对此进行建模?由于为map /简化视图存储了索引,因此在CouchDB中使用map / reduce会相当容易和高效,但我还没有想出如何在MongoDB中做得好。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

我认为可以实现此扩展的唯一方法如下:

为每个用户创建一个单独的集合,其中仅包含访问对象的权重。添加索引。然后从此集合中检索顶部加权的ObjectIds +权重。获取原始集合中顶部加权元素的ObjectIds +权重。合并这两个列表,最后检索所需的元素。

所有查询都被编入索引,因此这应该很快。结果集的分页代码更复杂(合并步骤),如果您的用户想要检查更多,则无法快速运行..让我们说第50页左右(只需禁用它,就像Google一样)。