首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mongo数据库分组+ distinct

Mongo数据库分组+ distinct
EN

Stack Overflow用户
提问于 2014-02-05 23:34:04
回答 1查看 117关注 0票数 0

给定如下的mongodb集合:

代码语言:javascript
复制
c = [{
    "name": "john",
    "tags": ["a", "b", "c"],
    "values": [1, 2, 3]
  },
  {
    "name": "paul",
    "tags": ["a", "d"],
    "values": [3, 4, 5]
  }
]

我想要进行一个匹配某些条件的查询,然后返回检索到的文档中所有可用条件的不同副本,这样,如果我查询:

“标记包含值a的所有文档”

我会得到:

代码语言:javascript
复制
[
  {
     "name": "john"
  },
  {
     "name": "paul"
  },
  "aggregated_tags": ["a", "b", "c", "d"],
  "aggregated_values": [1, 2, 3, 4, 5]
]

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

我知道我应该使用某种mongo聚合,但即使我能够使用正确的条件进行查询,我仍然不知道如何聚合/区分我获得的条件字段作为结果。

EN

回答 1

Stack Overflow用户

发布于 2014-02-06 05:12:24

你正在寻找的最终结果结构在返回的集合方面没有多大意义,但我假设你实际上是在为你想要的代码指向一些伪结构或其他数据结构。

在聚合中展开之后,您可以使用$addToSet来获得不同的值。为了简单起见,下面的示例只使用了标记,但这只是为了获得要点:

代码语言:javascript
复制
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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21581497

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档