我有一个包含这样文件的集合:
{
"User": { _id: 1, UserName: "username", DisplayName: "DisplayName" },
"Interests": [1, 4, 7, 25, 30, 34, 46],
"MinAge": 11,
"Title": "ad title",
...
}
我想选择与给定数组中最多兴趣点匹配的10个文档,例如:
array = [1,7, 30, 33, 38, 46, 55];
我怎么能这样做?
答案 0 :(得分:0)
它不会使用索引,因此是一个全表扫描,但我能想到的唯一方法是使用存储过程或UDF。
在任何一种情况下,您首先需要计算相交的数字。我建议你首先计算交集数组,然后取长度。 Here是一个用于计算数组交集的javascript代码的答案。
如果将其放在名为intersectionCount()
的UDF中,则可以使用它返回包含计数的所有行:
SELECT c.id, intersectionCount(c.Interests, [1, 7, 30, 33, 38, 46, 55]) AS intersectionCount FROM c ...
然后在客户端,您可以按intersectionCount
排序并进入前10名。或者,您可以通过在SQL中使用TOP子句来获得前10名,但这不允许您处理关系。例如,如果有15条记录具有相同数量的交叉点,该怎么办?一种策略是返回所有15个事件,尽管它超出了你想要的10个。另一种策略是截断列表。另一种策略是使用其他一些标准来挑选前10名。
要在存储过程中执行此操作,您必须在存储过程中包含该函数。然后,您将在存储过程中批量读取所有记录,通过调用函数计算计数,然后保留前10位。再次,您可能想要处理关系。