0

我的文档有一个失败的简单结构:

{regId: 1, data: {[{val: 123456}, {val: 324234}, {val: 4353453}, .......]}}

数据元素数组可能包含 30 到 60 个子文档,目前该集合有大约 53000 个文档,但会变得更大。

给定一个 val 数组,INPUT,[11563012,11563011,82867218,83866648, ....],我想返回至少有 3 个匹配 data.val 的文档。目前,我使用 $in 修饰符和调用 js 函数 (countMatches) 的 $where 子句进行查询。$in 修饰符返回包含至少一项 IMPUT 的任何文档,并且 $where 函数遍历每个 document.date,计算 INPUT 中的匹配项并仅返回高于阈值的文档:

db.foo.find({"data.val": {$in: [11563012,11563011,82867218,83866648,.......]}, $where: "countMatches(this.data, [11563012,11563011,82867218,83866648,......])>=3"}).count();

类似的问题(http://groups.google.com/group/mongodb-user/browse_thread/thread/fa291575fd47c010)似乎表明在“子文档”中计算匹配的唯一方法是使用 $ 中的 js 函数where 子句或使用 group() 聚合函数。

那么我的问题是,是否有更好的方法来计算子文档中的“命中”?这在语义上类似于查找“已标记”文档,即返回具有 [tag1, tag2, tag3, tag4,.....] 最匹配标签的文档

4

1 回答 1

0

您必须使用$where,没有更好的方法可以做到这一点。

请注意,如果您的$in过滤器返回大部分集合,您将无法使用此解决方案进行扩展......(并且很难使用任何其他解决方案进行扩展)

于 2011-07-06T21:46:32.187 回答