Mongodb分组+不同

时间:2014-02-05 15:34:04

标签: mongodb mongodb-query aggregation-framework

给出像这样的mongodb集合:

c = [{
    "name": "john",
    "tags": ["a", "b", "c"],
    "values": [1, 2, 3]
  },
  {
    "name": "paul",
    "tags": ["a", "d"],
    "values": [3, 4, 5]
  }
]

我想创建一个符合某些条件的查询,然后返回检索到的文档中所有可用条件的不同副本,这样如果我查询:

“所有标记包含值a

的文档

我会得到:

[
  {
     "name": "john"
  },
  {
     "name": "paul"
  },
  "aggregated_tags": ["a", "b", "c", "d"],
  "aggregated_values": [1, 2, 3, 4, 5]
]

我已经找到了一个解决方案,但我对它不满意,因为它涉及Python中的列表处理,以确保我过滤掉了“available_tags”和“available_values”中的所有重复术语,所以我'我正在寻找完成这项工作的聚合命令。

我知道我应该使用某种mongo聚合,但即使我能够使用正确的标准进行查询,我仍然无法弄清楚如何聚合/区分我得到的标准字段作为结果。

1 个答案:

答案 0 :(得分:1)

您正在寻找的最终结果结构在返回的集合方面没有多大意义,但我认为您实际上指向了一些伪结构或其他数据结构以获得所需的代码。

在汇总展开后,您可以使用$addToSet来获取不同的值。为简洁起见,下面的示例只是标签,但只是为了获得要点:

db.tags.aggregate([
    {$project: { _id: 0, tags: 1 }},
    {$unwind: "$tags" },
    {$sort: { tags: -1 } },
    {$group:{ _id: null, tags: {$addToSet: "$tags"} }},
}])

如果重要的话,排序是可选的维护顺序。

当然,您需要一个传统的查询来返回匹配元素的文档内容,但是单独的聚合查询可以为您提供该组文档中的组合标记和值,这看起来就像您所追求的那样。

如果您的匹配文档结果很大而且您只想显示20个匹配项,但仍希望所有匹配文档中的组合标记,则此功能特别有用。

就此而言,如果你所追求的是某种faceted search结果,那么你可能会发现一些对你的目标有用的阅读。

http://blog.mongodb.org/post/59757486344/faceted-search-with-mongodb