MongoDB 聚合结果缓存

3
我在mongodb中有一个相当大的集合,包含约100,000个文档(未分片)。这是Web应用程序的后端,基本上允许用户以不同的方式浏览此集合中相同信息的视图。
对于其中一种视图,我尝试使用聚合框架计算字段出现次数。这意味着要对整个集合进行聚合。问题是,这个聚合操作(它是一组简单的管道:group、sort和limit)需要2秒钟,这对于Web应用程序来说太慢了。
所以我的问题是:为了缓存这个聚合操作的结果,什么是首选方案?据我所知,不可能“聚合到”一个新的集合中,或者类似于这样的东西。目前,我发现的唯一解决方案是将整个结果读入变量,然后使用insert将该变量插入到新集合中 - 但我担心这涉及将大量数据从数据库发送到我的应用程序,再发送回数据库。
有什么建议吗?
管道示例:
res = items.aggregate([
    { "$group": { "_id": { "item_id": "$item_id", "title": "$title", "category": "$category" }, "count": { "$sum": 1 } } },
    { "$sort": { "count": -1 } },
    { "$limit": 5 }
])

模式基本上是这三个字段加几个不太相关的字段,例如:
doc = {
    "item_id": 1000,
    "title": "this is the item title",
    "category": "this is the item category"
}

我已经尝试对item_id和所有3个字段创建索引,但都没有成功。


1
也许如果您能提供文档的示例结构和聚合管道的步骤,会更有用。您使用索引吗? - attish
1个回答

1
聚合将结果返回到一个文档中。结果受16M的限制。该文档将返回给应用程序。
如果要对集合进行“聚合”,请使用map-reduce。
map_function = function () {
        emit(this.item_id, {"item_id": this.item_id, /* any other info */ "count": 1});
};

reduce_function = function (key, values) {
        var result = {"item_id": key, /* any other info should be given from one or any of values array objects */ "count": 0};
        values.forEach(function (value) {
                result["count"] += value["count"];
        });
        return result;
};

不确定是否可以发出结构值 - 请尝试。顺便说一下,发出关键字段是很好的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接