DocumentDB如何获取与给定数组中的大多数项匹配的文档

时间:2017-04-02 22:19:48

标签: azure azure-cosmosdb

我有一个包含这样文件的集合:

{
   "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];

我怎么能这样做?

1 个答案:

答案 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位。再次,您可能想要处理关系。