假设我有一个包含以下文档的集合:
{
_id: <someMongoId>,
status: 'start'
otherImportantData: 'Important!'
}
...状态可以是“开始”,“中间”或“结束”。
我想通过状态字段对这些文档进行排序(特别是在聚合框架中) - 但我不希望它按字母顺序排列;我想按顺序开始排序 - &gt;中 - &gt;端。
我一直在寻找某种方法将status
字段投射到数字的statusValue
字段(我可以指定每个字符串映射到的数字),尽管我是很高兴看到任何替代方案。
让我说我能做到。我带status
并将其映射为:
start: 1
middle: 2
end: 3
<anything else>: 0
然后我可以在聚合管道中做这样的事情:
{
$sort: { statusValue : 1 }
}
...但我不确定如何在聚合管道中映射这些状态。
如果没办法,至少我会知道停止寻找。什么是下一个最好的方式?使用MongoDB中的Map-Reduce功能?
答案 0 :(得分:2)
您可以在3.4中尝试以下聚合。
使用$indexOfArray
在值列表中找到搜索字符串的位置,并$addFields
将输出索引保留在文档的额外字段中,然后$sort
对文档进行排序< / p>
[
{"$addFields":{ "statusValue":{"$indexOfArray":[[start, middle, end], "$status"]}}},
{"$sort":{"statusValue":1}}
]