在聚合管道中,我有: -
{
"$project" => {
account_name_i: { "$toLower" => "$account_name" },
}
}
{
"$sort" => {
account_name_i: 1
}
}
我有索引{ account_name: 1 }
我的问题是在account_name上使用$ sort使用索引吗?如果不是,我们可以通过其他方式在聚合管道中实现这一目标吗?
答案 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})