聚合管道是否会使用派生字段的索引?

时间:2014-11-27 09:45:38

标签: mongodb mongodb-query

在聚合管道中,我有: -

  {
    "$project" => {
      account_name_i: { "$toLower" => "$account_name" },
    }
  }

  {
    "$sort" => {
      account_name_i: 1
    }
  }

我有索引{ account_name: 1 }

我的问题是在account_name上使用$ sort使用索引吗?如果不是,我们可以通过其他方式在聚合管道中实现这一目标吗?

3 个答案:

答案 0 :(得分:0)

没有。聚合管道只能在管道开头的$match$sort阶段使用标准索引。有关使用聚合管道的索引的规则将详细介绍in the manual

您的目标是对account_name_i的小写版本进行排序,最有可能作为不区分大小写的排序。要使用索引实现此目的,请在每个文档中存储小写规范化版本的account_name_i

{ "account_name_i" : "TruMAn's HABerdaShEry", "account_name_i_lc" : "truman's haberdashery" }

并索引标准化字段({ "account_name_i_lc" : 1 })。

答案 1 :(得分:0)

如果您正在使用聚合管道阶段,例如$ group或$ match,那么它将会 从该集合中生成一组新文档。

因为它是新的文档集,这意味着没有为它定义索引,因此我们无法使用聚合管道中的索引

注意:虽然如果使用$ sort作为Aggregation Pipeline的第一阶段,那么它将使用索引 作为这个阶段的输入的集合是集合本身。

答案 2 :(得分:0)

有点,但只有预处理。您可以在项目阶段之后执行输出并查询输出集合以进行排序:

db.yourSource.aggregate([
  {
    "$project" => {
      account_name_i: { "$toLower" => "$account_name" },
    }
  },
  {
    $out: "intermediate"
  }
])

db.intermediate.ensureIndex({account_name_i:1})

db.intermediate.find({}).sort({account_name_i:1})