首页 > 解决方案 > 是否可以在 MongoDB 中使用带有 $unwind 运算符的索引?

问题描述

假设我有一系列产品,如下所示:

[
  {
    "_id": 1,
    "sellerId",
    "body": {
      "subproducts": [
        {
          "sku": "sku1",
          "status": "Available"
        },
        {
          "sku": "sku2",
          "status": "Unavailable"
        },
        ...
      ]
    }
  },
  {
    "_id": 1,
    "sellerId",
    "body": {
      "subproducts": [
        {
          "sku": "sku3",
          "status": "Available"
        },
        {
          "sku": "sku4",
          "status": "Unavailable"
        },
       ...
      ]
    }
  },
  ...
]

我需要在所有子产品中找到重复项。为此,我创建了一个真正完成这项工作的聚合管道。它工作正常。但是在阅读了文档和 SO 问题之后,我仍然不确定是否可以使用索引来加快查询速度。查询如下:

db.collection.aggregate([
  {
    "$unwind": "$body.subproducts"
  },
  {
    "$group": {
      "_id": {
        sku: "$body.subproducts.sku",
        sellerId: "$sellerId"
      },
      ...
    }
  }
])

sort我读到,如果添加用于阶段中使用的字段,则可以使用索引,group因此我构建了一个索引{"body.subproducts.sku": 1, "sellerId": 1}并添加了一个排序阶段作为第一步:

db.collection.aggregate([
  {
    "$sort": {
      "sellerId": 1,
      "body.subproducts.sku": 1
    }
  },
  {
    "$unwind": "$body.subproducts"
  },
  ...

但这没有帮助。我在数据库中使用约 230k 产品得到的最快结果是 50 秒,根本没有排序。随着排序,它增加到近 2 分钟。我做错什么了吗?是否可以在不更改数据结构的情况下提高给定查询的速度?

标签: mongodb

解决方案


推荐阅读