Next.js/MongoDB -查询优化

siv3szwd  于 2022-11-22  发布在  Go
关注(0)|答案(1)|浏览(89)

我正在使用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
}

根据页面,我查询每个感兴趣字段的唯一值(来源、日期、品牌、系列、型号、尺寸、颜色、条件、联系人),并根据筛选器(例如,所选品牌型号的每个唯一值的编号)对其计数,我还根据这些字段的特定值查询文档。

bakd9h0s

bakd9h0s1#

如前所述,索引很重要,如果您正在通过我建议创建复合索引的字段进行查询,请参见此处的索引优化:https://learnmongodbthehardway.com/schema/indexes/
就聚合管道而言,没有什么异常,但是这个特定的聚合只返回每个模型匹配条件的项数,而不是匹配的文档。(有多少项是黑色的......)这样,当页面加载时,您不必查看200 k+项,而只是在预先计算的统计集合中。安排一个cron任务或使用lambda函数调用api上的一个路由,它将每天计算一次所有的统计数据,并将它们插入到一个新的集合中。
我也相信“and”是无用的,因为你可以使用隐含$and。你可以寻找一个对象,如:

{
 color : {$in : ['BLACK', 'BLUE']},
 size : 3
}

而不是:

[{color : 'BLACK'}, {color : 'BLUE'}, {size : 3}]

将显式的$和保留到真正需要的时候。

相关问题