给定如下的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聚合,但即使我能够使用正确的条件进行查询,我仍然不知道如何聚合/区分我获得的条件字段作为结果。
发布于 2014-02-06 05:12:24
你正在寻找的最终结果结构在返回的集合方面没有多大意义,但我假设你实际上是在为你想要的代码指向一些伪结构或其他数据结构。
在聚合中展开之后,您可以使用$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
https://stackoverflow.com/questions/21581497
复制相似问题