我的文档有一个简单的失败结构:
{regId: 1, data: {[{val: 123456}, {val: 324234}, {val: 4353453}, .......]}}
数据元素数组可能包含30到60个子文档,目前该集合有大约53000个文档,但会变得更大。
给定一组vals,INPUT,[11563012,11563011,82867218,83866648,....], 我想返回至少有3个匹配data.val的文档。目前,我使用$ in修饰符和调用js的$ where子句进行查询 function(countMatches)。 $ 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)似乎表明在“子文档”中计算匹配的唯一方法是 要么使用$ where子句中的js函数,要么使用group()聚合函数。
我的问题是,是否有更好的方法来计算子文档中的“命中率”?这在语义上类似于查找“已标记”文档,即返回具有[tag1,tag2,tag3,tag4,.....]
最匹配标记的文档答案 0 :(得分:0)
你必须使用$where
,没有更好的方法来做到这一点。
请注意,如果您的$in
过滤器返回大部分集合,您将无法使用此解决方案进行扩展......(并且使用任何其他解决方案进行扩展将很难)< / p>