Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MongoDB:按大型集合中的字段聚合组_Mongodb_Aggregation Framework - Fatal编程技术网

MongoDB:按大型集合中的字段聚合组

MongoDB:按大型集合中的字段聚合组,mongodb,aggregation-framework,Mongodb,Aggregation Framework,我有一个大型(数百万)文件集合,其中标记是这样的数组字段 { "volume" : "abc", "name" : "file1.txt", "type" : "txt", "tags" : [ "Interesting", "Weird" ], ...many other fields } 现在我想返回整个集合的唯一标记计数。我使用的是聚合。这是我的问题 db.files.aggregate( { "$match" : {"volume":"ab

我有一个大型(数百万)文件集合,其中标记是这样的数组字段

{
    "volume" : "abc", 
    "name" : "file1.txt", 
    "type" : "txt", 
    "tags" : [ "Interesting", "Weird" ], ...many other fields
}
现在我想返回整个集合的唯一标记计数。我使用的是
聚合
。这是我的问题

db.files.aggregate(
    { "$match" : {"volume":"abc"}},
    { "$project" : { "tags" : 1}},
    { "$unwind" : "$tags"},
    { "$group" : { "_id" : "$tags" , "count" : { "$sum" : 1}}},
    { "$sort" : { "count" : 1}}
)
我发现,对于120万个文件的集合,返回此文件大约需要3秒钟。我在
标签
字段上有索引

我正在使用MongoDB 2.4。由于2.6尚未推出,我无法在此处使用
.explain()


有什么办法可以提高这个性能吗?我需要做一个汇总计数。此外,我无法预先计算这些计数,因为我的
$match
将根据卷、类型、特定标记、文件的某些日期时间等而变化。

您担心性能,因为您需要定期使用此报告?据我所知,unwind是一个性能杀手,这个查询是通过用户操作在UI中实时运行的。在这种情况下,我有一个建议。创建一个附加集合以保存标记。每当用户添加标记时,都要将标记集合与原始集合一起更新。您将在主文档和新集合中的两个位置拥有标记。这将为您提供良好的性能。实际上,尽管没有文档记录,但如果您有2.4.9,那么您可以使用explain。两种情况下的输出都只显示使用的索引,当然还有管道的内容。至于您的实际问题,缺少一些信息。对于给定的查询,有多少文档与初始的
$match
语句(将使用索引)匹配?另外,该匹配中文档的
标记
数组的最大大小是多少?你也可以考虑平均大小。如果其中任何一个数组数超过500,则很可能出现问题。