【问题标题】:Counting sub-document matches in a mongo document计算 mongo 文档中的子文档匹配
【发布时间】: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]}
  • 我简化了帖子的结构;每个子文档实际上都有更多与查询无关的元素

标签: mongodb counting


【解决方案1】:

您必须使用$where,没有更好的方法。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-30
    • 1970-01-01
    • 1970-01-01
    • 2022-01-09
    • 2015-02-10
    • 2015-08-19
    • 2017-05-18
    • 2019-03-19
    相关资源
    最近更新 更多