温馨提示:本文翻译自stackoverflow.com,查看原文请点击:sorting - MongoDB aggregate with lookup and sort using associated collection fields is slowing down the query
limit lookup mongodb sorting

sorting - 使用关联集合字段进行查找和排序的MongoDB聚合正在减慢查询速度

发布于 2020-04-18 10:02:21

我的mongodb数据库中有两个集合,如下所示:

employee_details包含大约330000个文档,这些文档具有 department_id作为部门集合的参考

具有两个字段 _id dept_name的部门集合

我已将索引添加到集合中

db.departments.createIndex( { dept_name: 1 } )
db.employee_details.createIndex( { department_id: 1 } )
db.employee_details.createIndex( { employee_fname: 1 } )

我想通过加入两个集合来获取要在数据表上列出的数据。但是当我尝试这样做时,我遇到了两个问题。

首先,当我在查询后添加排序时,运行查询需要很长时间,我在查询后添加了排序,因为我需要使用收集部门的dept_name进行排序。查询如下

db.getCollection("employee_details").aggregate([
  {
    $lookup: {
      from: "departments",
      localField: "department_id",
      foreignField: "_id",
      as: "Department"
    }
  },
  { $unwind: { path: "$Department", preserveNullAndEmptyArrays: true } },
  { $sort: { "Department.dept_name": 1 } },
  { $limit: 30 }
]);

其次,当我在查找上方添加排序时,查询变得很快,但是如果我使用dept_name或department_id进行排序,则结果将给出错误的排序(排序对于employee_details集合的字段而言效果很好)。查询如下

db.getCollection("employee_details").aggregate([
  { $unwind: { path: "$Department", preserveNullAndEmptyArrays: true } },
  { $sort: { "Department.dept_name": 1 } },
  //{ $sort: { "department_id": 1 } }, // tried this also
  { $limit: 30 },
  {
    $lookup: {
      from: "departments",
      localField: "department_id",
      foreignField: "_id",
      as: "Department"
    }
  }
]);

有人可以提供一种优化的解决方案来从所有相关集合中获取数据以及排序。先感谢您。

查看更多

提问者
Ajith
被浏览
148
SuleymanSah 2020-02-06 14:08

您可以使用以下聚合:

db.getCollection("departments").aggregate([
    {
        $sort: {
            "dept_name": 1
        }
    },
    {
        $lookup: {
            from: "employee_details",
            localField: "_id",
            foreignField: "department_id",
            as: "employees"
        }
    },
    {
        $unwind: "$employees"
    },
    {
        $limit: 30
    },
    { $addFields: { "employees.department_name": "$dept_name" } },
    { $replaceRoot: { newRoot: "$employees" } }
])

这将适用于MongoDB 3.4版,即使没有任何索引也足够快。