我正在使用Next.js和MongoDB建立一个网站。在我的一个网页上,我实现了过滤器来帮助搜索产品。为了检索和更新过滤器(每次过滤器改变时更新项目计数),我有一个API端点来查询我的MongoDB集合。这个特定的集合包含~200.000个项目。每个项目都有几个字段,如品牌,型号,地点等...
我有9个字段用于过滤,因此每次有变化时都必须通过我的api获取。因此,我有9个查询通过我的api运行,对每个字段/过滤器,MongoDB上的查询如下所示:
var models = await db_collection
.aggregate([
{
$match: {
$and: [filter],
},
},
{
$group: { _id: '$model', count: { $sum: 1 } },
},
{ $sort: { _id: 1 } },
])
.toArray();
问题是,由于有9个查询在运行,页面的更新(主要是由于查询)需要~ 4秒,这是太长了。我希望达到〈1秒。如果有一个好的做法,我现在想做,我错过了,如做一个查询,而不是一个过滤器,或可能是我的数据库优化。
谢谢你的好意,
我曾尝试在聚合管道上的$group
之前使用$project
参数进行查询,以减少返回的字段数,使用distinct
,然后排序而不是aggregate
,但这些解决方案似乎都不能提高效率。
编辑:正如R2D2所建议的,我在MongoDB上发布了一个文档的结构:
{
_id : ObjectId('example_id')
source : string
date : date
brand : string
family : string
model : string
size : string
color : string
condition : string
contact : string
SKU : string
}
根据页面,我查询每个感兴趣字段的唯一值(来源、日期、品牌、系列、型号、尺寸、颜色、条件、联系人),并根据筛选器(例如,所选品牌型号的每个唯一值的编号)对其计数,我还根据这些字段的特定值查询文档。
1条答案
按热度按时间bakd9h0s1#
如前所述,索引很重要,如果您正在通过我建议创建复合索引的字段进行查询,请参见此处的索引优化:https://learnmongodbthehardway.com/schema/indexes/
就聚合管道而言,没有什么异常,但是这个特定的聚合只返回每个模型匹配条件的项数,而不是匹配的文档。(有多少项是黑色的......)这样,当页面加载时,您不必查看200 k+项,而只是在预先计算的统计集合中。安排一个cron任务或使用lambda函数调用api上的一个路由,它将每天计算一次所有的统计数据,并将它们插入到一个新的集合中。
我也相信“and”是无用的,因为你可以使用隐含$and。你可以寻找一个对象,如:
而不是:
将显式的$和保留到真正需要的时候。