Mongodb聚合结果缓存

Mongodb聚合结果缓存,mongodb,aggregation-framework,Mongodb,Aggregation Framework,我在mongodb有一个相当大的集合,大约有100000个文档(不是碎片)。这是web应用程序的后端,基本上只允许用户以不同的方式浏览此集合中的相同信息 对于其中一个视图,我尝试使用聚合框架计算字段的出现次数。这意味着聚合整个集合。问题是这个聚合操作(这是一个简单的组、排序和限制管道)需要2秒钟,对于web应用程序来说太慢了 所以我的问题是,;要缓存此聚合操作的结果,首选的解决方案是什么?据我所知,不可能“聚合到”一个新的集合或类似的东西。目前,我找到的唯一解决方案是将整个结果读取到一个变量中,

我在mongodb有一个相当大的集合,大约有100000个文档(不是碎片)。这是web应用程序的后端,基本上只允许用户以不同的方式浏览此集合中的相同信息

对于其中一个视图,我尝试使用聚合框架计算字段的出现次数。这意味着聚合整个集合。问题是这个聚合操作(这是一个简单的组、排序和限制管道)需要2秒钟,对于web应用程序来说太慢了

所以我的问题是,;要缓存此聚合操作的结果,首选的解决方案是什么?据我所知,不可能“聚合到”一个新的集合或类似的东西。目前,我找到的唯一解决方案是将整个结果读取到一个变量中,然后使用insert将该变量插入到一个新集合中——但我担心这涉及到将大量数据从数据库=>发送到我的应用程序=>返回数据库

有什么建议吗

管道示例:

res = items.aggregate([
    { "$group": { "_id": { "item_id": "$item_id", "title": "$title", "category": "$category" }, "count": { "$sum": 1 } } },
    { "$sort": { "count": -1 } },
    { "$limit": 5 }
])
该模式基本上是3个字段+几个真正不相关的字段,即:

doc = {
    "item_id": 1000,
    "title": "this is the item title",
    "category": "this is the item category"
}

我尝试对项目id和所有3个字段进行索引,但均未成功。

聚合将结果返回到一个文档。结果限制在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;
};

不确定是否可以发射结构值-请重试。顺便说一句,发出密钥字段很好。

如果您能提供文档的示例结构和聚合管道的步骤,可能会很有用。你使用索引吗?