2014-02-05 168 views
0

给出一个MongoDB的集合是这样的:蒙戈DB分组+不同

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

查看$ unwind运算符。这使数组像我想你想要的:http://docs.mongodb.org/manual/reference/operator/aggregation/unwind/ – Alex

+0

谢谢。我想我想出了如何使用'$ unwind',但我仍然不确定这是否是最好的方法。我将在明天更新答案。 –

回答

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