Mongodb UPDATE使用$sort将数组重新排序

学习mongodb,体会mongodb的每一个使用细节,欢迎阅读威赞的文章。这是威赞发布的第74篇mongodb技术文章,欢迎浏览本专栏威赞发布的其他文章。如果您认为我的文章对您有帮助或者解决您的问题,欢迎在文章下面点个赞,或者关注威赞。谢谢。

本文继续探讨对文档数组类型字段进行更新。可以思考平时是否遇到这样的需求。数据插入数组字段后,需要对数组字段进行排序。比如找出昨天温度最高的几个城市,或者降水量最多的几个城市。或者成绩最高的几个同学。这里都需要使用到排序。Mongodb在push操作中,提供了sort数据修饰符,允许用户向数组插入元素后,对数组进行排序。

定义

sort方法在push操作过程中,修改数组元素的排序。sort方法,必须和each共同使用。mongodb允许用户传递一个空的数组给each方法,保证用户无须向数组中插入元素也可以将数组进行排序。sort方法,按照下面的形式来使用。

复制代码
{
    $push: {
        <field>: {
            $each: [<value1>, <value2>, ...],
            $sort: <sort specification>
        }
    }
}

对于sort specification, 当对非文档数组进行排序,或对整个文档作为整体进行排序时,正序可以指定1, 倒序可以指定为-1.当对文档字段进行排序时,指定要排序的字段和排列顺序。不需要添加数组字段的字段名称。

行为

  • 自mongodb5.0开始,UPDATE操作按照字段名称的字典顺序更新字段。当字段中包含数字时,按照数字顺序依次更新字段。当然,对一个文档的多个字段操作,是原子性的。
  • $sort可以对数组中的文档进行排序。这种排序可以发生在整个文档或者文档的部分字段当中。
  • sort方法必须和each方法共同使用,否则报错

应用

对数组中的文档进行排序

向students集合中插入数据,其中quzzes是文档数组类型字段。

复制代码
db.students.insertOne(
    {
        _id:1,
        quzzes: [
            {id:1, score:6},
            {id:2, score:9}
        ]
    }
)

构建更新语句,要求向quzzes插入数组元素,并按照score正序进行排序。

复制代码
db.students.updateOne(
    {_id:1},
    {
        $push: {
            quzzes: {
                $each: [
                    {id:3, score:8},
                    {id:4, score:7},
                    {id:5, score:6}
                ],
                $sort: {score:1}
            }
        }
    }
)

查看数据更新结果

复制代码
db.students.find().pretty();
[
  {
    "_id": 1,
    "quzzes": [
      {
        "id": 1,
        "score": 6
      },
      {
        "id": 5,
        "score": 6
      },
      {
        "id": 4,
        "score": 7
      },
      {
        "id": 3,
        "score": 8
      },
      {
        "id": 2,
        "score": 9
      }
    ]
  }
]

使用$sort排列非文档数据类型。

向students集合插入数据。其中test字段是数值类型的数组。

复制代码
db.students.insertOne({
    _id:2,
    tests: [
        89,70,89, 50
    ]
})

更新插入的数据, 要求插入新数据40, 60并对数组按照正序进行排序。

复制代码
db.students.updateOne({
    _id:2
},{
    $push: {
        tests: {
            $each: [40, 60],
            $sort: 1
        }
    }
})

查看数据更新结果

复制代码
db.students.find()
{
    "_id": 2,
    "tests": [
      40,
      50,
      60,
      70,
      89,
      89
    ]
  }

仅使用$sort对数组进行排序

向students集合插入数据,其中tests是数值类型的数组

复制代码
db.students.insertOne({
    _id:3, tests: [89, 70, 100, 20]
})

修改新插入的文档,要求将tests字段按照倒序排序。

复制代码
db.students.updateOne({
    _id:3
},{
    $push: {
        tests: {
            $each: [],
            $sort: -1
        }
    }
})

查看更新后的结果

复制代码
{
    "_id": 3,
    "tests": [
      100,
      89,
      70,
      20
    ]
  }

sort配合使用push的其他操作符

向students集合中插入数据。其中quizzes是文档型数组元素。

复制代码
db.students.insertOne({_id:5, quizzes:[{wk:1, score:10}, {wk:2, score:8}, {wk:3, score:5}, {wk:4, score:6}]})

构建数据更新语句,要求向quizzes插入数据,并将数组按照scores从高到低的顺序排列,只保留前面三个数组元素。

复制代码
db.students.updateOne(
    {_id:5}, 
    {$push: 
     {quizzes: {
         $each: [{wk:5, score:8}, {wk:6, score:7}], 
         $slice: 3, 
         $sort: {score:-1}
     }
     }
    }
)

查询更新后的结果

复制代码
db.students.find({_id:5})
[
  {
    "_id": 5,
    "quizzes": [
      {
        "wk": 1,
        "score": 10
      },
      {
        "wk": 2,
        "score": 8
      },
      {
        "wk": 5,
        "score": 8
      }
    ]
  }
]
相关推荐
稚辉君.MCA_P8_Java10 分钟前
DeepSeek 插入排序
linux·后端·算法·架构·排序算法
多多*13 分钟前
Java复习 操作系统原理 计算机网络相关 2025年11月23日
java·开发语言·网络·算法·spring·microsoft·maven
风123456789~1 小时前
【OceanBase专栏】OB背景知识
数据库·笔记·oceanbase
4***72131 小时前
【玩转全栈】----Django模板语法、请求与响应
数据库·python·django
c***42101 小时前
Django视图与URLs路由详解
数据库·django·sqlite
数据库学啊1 小时前
团队小希望运维简单,时序数据库选型有什么推荐?
运维·数据库·时序数据库
.YM.Z1 小时前
【数据结构】:排序(一)
数据结构·算法·排序算法
Chat_zhanggong3451 小时前
K4A8G165WC-BITD产品推荐
人工智能·嵌入式硬件·算法
百***48072 小时前
【Golang】slice切片
开发语言·算法·golang
墨染点香2 小时前
LeetCode 刷题【172. 阶乘后的零】
算法·leetcode·职场和发展