首页 > 解决方案 > 对于一个特定文档,mongodb 查询非常慢

问题描述

我有以下用于 ERP 系统的数据库结构:我有一个与类别集合相关的产品集合,两个集合之间的关系使用 _id,产品包含与之相关的类别 ID。我在根据特定类别(即“超市”)过滤产品时遇到问题,应用程序查询在响应超时之前仍然没有任何响应,但是当根据另一个类别过滤这些产品时它工作正常,算法按类别名称过滤产品,如下所示:

let category = await Category.findOne({
      $or: [
        { "name.en": { $regex: queries.category, $options: "i" } },
        { "name.ar": { $regex: queries.category, $options: "i" } }
      ]
    })
    if (category) {
      search.categories = { $in: [category._id] };
    }

然后找到包含找到的类别 id 的产品,如下所示:

let products = await Product.find(search, "", {
            skip: currentProducts,
            limit: limit
          })

该过程适用于除超市类别之外的任何类别名称,我确信该类别存在并且有产品包含它,但它仍然搜索没有任何响应,直到超时,所以这里有什么问题?

那么设计数据库是一件好事还是有更好的设计?但是索引产品的方法是显示商店相关产品,这需要索引自定义价格集合以查找商店价格,这使得查询时间约为 5 毫秒,所以这是好还是有更好的解决方案?,但是我使用的是本机mongodb聚合和查找

编辑

这是产品集合文档的示例:

{
"_id": "5dd51c43147001172871c61a",
"status": "approved",
"price": 59.95,
"categories": [
    "5dd51c37147001172871c413",
    "5dd51c37147001172871c414",
    "5dd51c3d147001172871c59d",
    "5dd52a056ceb13168dd5b04a",
    "5dd5b96365a4b415de04f900"
],
"updateState": false,
"stores": [
    "5dde07ec24c64142ceacb851",
    "5dde07ec24c64142ceacb854",
    "5dde07ed24c64142ceacb858",
    "5dde07ee24c64142ceacb866",
    "5dde07ee24c64142ceacb86a",
    "5dde07ef24c64142ceacb86c",
    "5dde07f024c64142ceacb874",
    "5dde07f024c64142ceacb876",
    "5dde1c2b40392b4228a1b9e3"
],
"gallery": [],
"customPrices": [
    "5dde1c2c40392b4228a1bbe8",
    "5dde2ab240392b4228a23cfd",
    "5dde2ab540392b4228a23da9",
    "5dde2ab240392b4228a23d12",
    "5dde2ab640392b4228a23de1",
    "5dde2ab640392b4228a23df2",
    "5dde2ab540392b4228a23db6",
    "5dde2ab240392b4228a23d15",
    "5dde2ab540392b4228a23d9a"
],
"disabled": false,
"deleted": false,
"extras": [],
"createdAt": "2019-11-20T10:58:11.112Z",
"title": {
    "en": "Easy Care Baby Wipes For Sensitive Skin - 80 Wipes Pack Of 21",
    "ar": "ايزي-كير مناديل مبللة للاطفال للبشرة الحساسة - 80 مناديل مبللة عبوة من 21"
},
"image": {
    "name": "/uploads/Carrefour%20Images/477829_0.jpg",
    "path": "/uploads/Carrefour%20Images/477829_0.jpg"
},
"barcode": "477829",
"quantity": 1,
"brand": {
    "en": "",
    "ar": ""
},
"type": "global",
"__v": 0
}

这是自定义价格收集文件的示例:

{
 "_id": "5dda5dd87675c70c6fcce125",
 "price": 59,
 "store": "5dcdb1ffb20788411552596b",
 "product": "5dd68853086f1c37f851c31b",
 "__v": 0
}

我为产品集合中的以下字段创建了索引:

1- title.en 2- title.ar 3- customPrices 4- 商店

并在 customPrices 集合中为以下字段创建索引:

1- 商店 2- 产品

我观察到正则表达式在某些情况下效果不佳,例如使用单词+空格搜索时会花费很多时间,所以请任何人帮助我优化应用程序的性能,以及数据库会更多在不久的将来更大

标签: javascriptnode.jsdatabasemongodbbackend

解决方案


推荐阅读