当前位置: 首页 > news >正文

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}]}
]

相关文章:

  • 【嵌入式开发】UART
  • grpc代理服务的实现(一)
  • 硬引用、软引用、弱引用、虚引用和原子引用
  • 架构风格-系统架构师(十五
  • Pipeline知识小记
  • 复分析——第6章—— Γ 函数和 ζ 函数(E.M. Stein R. Shakarchi)
  • PCL 点云RANSAC+SVD提取平面
  • 一文了解HarmonyOSNEXT发布重点内容
  • ubuntu22.04安装onlyoffice社区版
  • React-配置json-server
  • 认识和使用 Vite 环境变量配置,优化定制化开发体验
  • 鸿蒙NEXT开发中的知识:构建自己的ArkTS应用工程(Stage模型)
  • Redis面试题自测
  • leetcode34:在排序数组中查找元素的第一个和最后一个位置
  • JMeter的基本使用与性能测试,完整入门篇保姆式教程
  • [deviceone开发]-do_Webview的基本示例
  • [NodeJS] 关于Buffer
  • 《剑指offer》分解让复杂问题更简单
  • 【剑指offer】让抽象问题具体化
  • 30天自制操作系统-2
  • android 一些 utils
  • CSS魔法堂:Absolute Positioning就这个样
  • Java深入 - 深入理解Java集合
  • jQuery(一)
  • JS变量作用域
  • October CMS - 快速入门 9 Images And Galleries
  • Python_网络编程
  • Spark in action on Kubernetes - Playground搭建与架构浅析
  • Vim Clutch | 面向脚踏板编程……
  • XForms - 更强大的Form
  • 对话 CTO〡听神策数据 CTO 曹犟描绘数据分析行业的无限可能
  • 后端_MYSQL
  • 基于 Ueditor 的现代化编辑器 Neditor 1.5.4 发布
  • 聊聊spring cloud的LoadBalancerAutoConfiguration
  • 用mpvue开发微信小程序
  • 阿里云API、SDK和CLI应用实践方案
  • # linux从入门到精通(三)
  • ###C语言程序设计-----C语言学习(6)#
  • (4)logging(日志模块)
  • (9)目标检测_SSD的原理
  • (day 2)JavaScript学习笔记(基础之变量、常量和注释)
  • (二十九)STL map容器(映射)与STL pair容器(值对)
  • (附源码)springboot金融新闻信息服务系统 毕业设计651450
  • (机器学习-深度学习快速入门)第一章第一节:Python环境和数据分析
  • (考研湖科大教书匠计算机网络)第一章概述-第五节1:计算机网络体系结构之分层思想和举例
  • (论文阅读23/100)Hierarchical Convolutional Features for Visual Tracking
  • (七)glDrawArry绘制
  • (十六)Flask之蓝图
  • (十一)手动添加用户和文件的特殊权限
  • (算法)Travel Information Center
  • (限时免费)震惊!流落人间的haproxy宝典被找到了!一切玄妙尽在此处!
  • (详细版)Vary: Scaling up the Vision Vocabulary for Large Vision-Language Models
  • (原創) 如何優化ThinkPad X61開機速度? (NB) (ThinkPad) (X61) (OS) (Windows)
  • (转) 深度模型优化性能 调参
  • (转)淘淘商城系列——使用Spring来管理Redis单机版和集群版