【发布时间】:2011-09-26 06:31:18
【问题描述】:
我的文档结构很简单:
{regId: 1, data: {[{val: 123456}, {val: 324234}, {val: 4353453}, .......]}}
数据元素数组可能包含 30 到 60 个子文档,目前该集合有大约 53000 个文档,但会变得更大。
给定一个 val 数组,INPUT,[11563012,11563011,82867218,83866648, ....], 我想返回至少有 3 个匹配 data.val 的文档。目前,我使用 $in 修饰符和调用 js 的 $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) 似乎表明在“子文档”中计算匹配的唯一方法是 在 $where 子句中使用 js 函数或使用 group() 聚合函数。
那么我的问题是,有没有更好的方法来计算子文档中的“命中”?这在语义上类似于查找“已标记”文档,即返回具有 [tag1, tag2, tag3, tag4,.....] 最匹配标签的文档
【问题讨论】:
-
我能问一下为什么你的文件是这样的吗?应该是简单的
{regId: 1, data: [123456, 324234, 4353453]} -
我简化了帖子的结构;每个子文档实际上都有更多与查询无关的元素