2012-02-01 60 views
3

我在比较mongo集合中潜在的数百万个文档之间的字段。这些字段将提前确定,并将权重分配给每个字段。然后这些权重将用于返回代表“喜欢”文档建议的文档对。例如,如果要比较两个文档,并且两个文档的字段'first_name'具有相同的值,则会参考权重表,并为该对的分数添加该权重。如果两者之间的另一个字段相同,分数将更新以反映较高的相似度。比较MongoDB中的文档

我目前正在通过迭代初始结果集来处理这个问题,然后进行嵌入式迭代,该迭代也会经过结果集并将每个文档与第一个迭代器所在的文档(效率极低)进行比较。这当前全部由php完成,因为它通过光标捕获元素。

我打开任何建议,包括MapReduce实现(似乎并不适用),光标操作,几乎任何你可以想出来简化过程,因为我现在在O(n^2)复杂性工作(好吧,稍微好一点,因为我跳过了第一个迭代器已经覆盖的文档)。

回答

0

为避免n^2,您必须查看将字段及其值存储在参考集合中,例如, :

{ 
    field: "firstName", 
    value: "Remon", 
    documents : [ <list with all document _ids of documents that have "field" set to "value">] 
} 

这样你就可以直接在此集合查询来获取那些“喜欢”你的源文件的所有文档。此外,这允许您使用单个O(n)查询来查询多个键/值对。

显然唯一棘手的事情是保持在第一位,但在你的情况下,这个基准集,似乎很简单(当你更新字段更新引用)。

这有帮助吗?

+0

我看着创建一个非常类似的设置,并希望避免创建额外的集合来维护,但这看起来更像是我必须去的路线。感谢您的意见。 – Ghjnut 2012-02-03 03:08:53