MongoDB聚合运算符:$sortArray
文章目录
$sortArray
聚合运算符根据指定的排序规则对数组元素进行排序。
语法
$sortArray: {
input: <array>,
sortBy: <sort spec>
}
input
:为可解析为数组的表达式,如果表达式字段缺失、为null或undefined,则返回null,如果表达式为其他非数组的值,则返回错误。sortBy
:文档类型,用于指定排序方式。
使用
$sortArray
表达式根据sortBy
规范对输入数组进行排序。$sortArray
的语法和语义与通过$sort
修改的$push
操作中的行为相同。
根据文档字段进行排序
如果数组元素是文档,则可以按文档字段排序,指定字段名称和排序方向:升序 (1
) 或降序 (-1
)。
{
input: <array-of-documents>,
sortBy: {
<document-field>: <sort-direction> }
}
根据值排序
要按值对整个数组进行排序,或按非文档的数组元素进行排序,需要指定输入数组并在 sortBy
参数中指定 1
表示升序排序,或指定 -1
表示降序排序。
{
input: <array-of-documents>,
sortBy: <sort-direction>
}
注意事项
- 对于排序的键值,不会进行隐式数组遍历。
- 不支持位置运算符,像
"values.1"
这样的字段名称表示value
数组中名为"1"
的子字段,而不是引用数组中的第1
个元素。 - 当整个数组排序时,排序按字典顺序,与聚合
$sort
阶段的行为有所不同。 - 当数组按字段排序时,任何不具有指定字段的文档或标量会被平均排序,也就是结果的排序顺序不确定。
null
和缺失值按照同等顺序排序。$sortArray
的排序是不稳定的,不应依赖其排序算法的稳定性。
举例
使用下面的脚本创建team
集合:
db.engineers.insertOne(
{
"team":
[
{
"name": "pat",
"age": 30,
"address": {
"street": "12 Baker St", "city": "London" }
},
{
"name": "dallas",
"age": 36,
"address": {
"street": "12 Cowper St", "city": "Palo Alto" }
},
{
"name": "charlie",
"age": 42,
"address": {
"street": "12 French St", "city": "New Brunswick" }
}