gpt4 book ai didi

Mongodb聚合结果缓存

转载 作者:可可西里 更新时间:2023-11-01 09:52:52 25 4
gpt4 key购买 nike

我在 mongodb 中有一个相当大的集合,其中包含大约 100 000 个文档(未分片)。这是一个 Web 应用程序的后端,基本上只允许用户浏览不同的方式来查看此集合中的相同信息。

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

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

有什么建议吗?

管道示例:

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"
}

我已尝试对 item_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;
};

不确定您是否可以发出结构值 - 请尝试。顺便说一句,发射关键领域是好的。

关于Mongodb聚合结果缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14650694/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com