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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/31238.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用构造函数注入实现 Spring 依赖注入

Spring 框架提供了多种方式来实现依赖注入&#xff0c;其中构造函数注入是最推荐的一种方式。通过构造函数注入&#xff0c;可以确保所有必需的依赖在对象创建时就被提供&#xff0c;避免了未初始化的依赖导致的潜在问题。本文将详细介绍如何使用构造函数注入实现 Spring 依赖注…

Linux 软链接

# 语法 ln -s <文件夹or文件的真实路径> <自定义路径别名> # 例子 ln -s /etc/sysconfig/network-scripts/ifcfg-ens33 ~/ens33

如何选择合适的半桥栅极驱动芯片?KP8530X,KP85402,KP85211A满足你对半桥栅极驱动一切需求

半桥栅极驱动系列KP8530X&#xff0c;KP85402&#xff0c;KP85211A在功率电子领域展现出卓越的性能和可靠的品质。具备诸多显著优势。首先&#xff0c;半桥栅极驱动系列KP8530X&#xff0c;KP85402&#xff0c;KP85211A拥有出色的耐压性能&#xff0c;可承受高达数百伏的电压&a…

告别繁琐录入,一键解锁OCR魅力:高效文字识别工具推荐

在日常工作中&#xff0c;我们常常会需要找一些模版&#xff0c;如果直接下载编辑某某文档&#xff0c;都是要花钱的。 比如领导让我找个法律文书&#xff0c;改成我们的内容&#xff0c;网上有很多的参考文档&#xff0c;但是不论哪个&#xff0c;下载都要钱&#xff0c;也不…

如何开展小组讨论以强化员工对TPM的关注度?

TPM是一种旨在提高设备综合效率&#xff0c;通过全员参与的方式&#xff0c;实现设备保养和维护的现代化管理体系。因此&#xff0c;如何开展小组讨论以强化员工对TPM的关注度成为了一个值得探讨的话题。本文&#xff0c;深圳天行健精益管理咨询公司为大家分享具体步骤如下&…

YOLOv10改进 | Conv篇 |YOLOv10引入SPD-Conv卷积

1. SPD-Conv介绍 1.1 摘要:卷积神经网络(CNN)在图像分类和目标检测等许多计算机视觉任务中取得了巨大的成功。 然而,在图像分辨率较低或物体较小的更艰巨的任务中,它们的性能会迅速下降。 在本文中,我们指出,这源于现有 CNN 架构中一个有缺陷但常见的设计,即使用跨步卷…

adb 截屏和录屏命令

adb 录屏命令 screenrecord 简介 screenrecord 是一个 shell 命令 支持 Android 4.4(API level 19)以上 支持视频格式: mp4 一些限制 某些设备可能无法直接录制,原因是分辨率太高,如果遇到此类问题&#xff0c;请试着指定较低的分辨率 不支持录制过程中屏幕旋转,如果录制…

Linux机器通过Docker-Compose安装Jenkins发送Allure报告

目录 一、安装Docker 二、安装Docker Compose 三、准备测试用例 四、配置docker-compose.yml 五、启动Jenkins 六、配置Jenkins和Allure插件 七、创建含pytest的Jenkins任务 八、项目结果通知 1.通过企业微信通知 2.通过邮件通知 九、配置域名DNS解析 最近小编接到一…

Excel中插入的图片在不同电脑上消失的问题及解决方法

在使用Excel时插入图片&#xff0c;然后在不同电脑上打开却发现图片消失并被替换为链接地址&#xff0c;这个问题通常出现于文件中的图片路径没有正确保存或者电脑上缺少相关的图片文件。下面让我们来详细解释这个问题以及可能的解决方法。 ### 问题原因分析1. **相对路径问题…

接到一家公司做团购活动类型的策划海报项目,使用AI给他们设计了相关的海报

在这个充满挑战和机遇的时代&#xff0c;我有幸接到一家公司的委托&#xff0c;为他们策划一场团购活动。这不仅是对我的专业能力的认可&#xff0c;也是对我创新思维的考验。 这家公司是一家知名的电子产品销售商&#xff0c;他们希望通过团购活动来提升产品的销售量和品牌的…

使用 CTranslate2 实现 Faster Whisper 的加速转录

使用 CTranslate2 实现 Faster Whisper 的加速转录 近年来&#xff0c;语音识别技术得到了快速发展。OpenAI 的 Whisper 模型作为其中的佼佼者&#xff0c;以其高精度和强大的性能广受欢迎。然而&#xff0c;其较长的推理时间和高内存消耗也成为了限制其应用的一大因素。为了解…

个人职业规划(含前端职业线路、前端技术线路、前端核心竞争力、大龄程序员的出路)

1. 了解自己的兴趣与长处 喜欢擅长的事 职业方向 2. 设定长期目标&#xff08;5年&#xff09; 目标内容 建立自己的品牌建立自己的社交网络 适量参加社交活动&#xff0c;认识更多志同道合的小伙伴寻求导师指导 建立自己的作品集 注意事项 每年元旦进行审视和调整永葆积极…

哪个充电宝牌子好?性价比高与质量好并存!热门充电宝推荐!

随着科技的不断进步&#xff0c;我们的日常生活越来越依赖于便携式电子设备。然而&#xff0c;电池续航问题始终是这些设备的一大软肋。为了确保我们的智能手机、平板电脑、甚至是智能手表在忙碌的日子里始终有电&#xff0c;一个可靠的充电宝成为了我们的必备之选。面对市场上…

Nginx + Tomcat 负载均衡、动静分离

前言 Tomcat简介 最初是由Sun的软件构架师詹姆斯邓肯戴维森开发 安装Tomcat后&#xff0c;安装路径下面的目录和文件&#xff0c;是使用或者配置Tomcat的重要文件 Nginx 应用 Nginx是一款非常优秀的HTTP服务器软件 &#xff08;1&#xff09;支持高达50 000个并发连接数的响应…

Java中的CQRS和事件溯源模式解析

Java中的CQRS和事件溯源模式解析 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 在软件开发领域&#xff0c;有许多设计模式和架构思想可以帮助开发人员构建高…

MR混合现实模拟陪同口译课堂情景

MR混合现实情景实训教学系统在陪同口译课堂上的应用&#xff1a; 首先&#xff0c;它能够提供逼真的模拟环境&#xff0c;使学生能够身临其境地体验陪同口译的实际情况&#xff0c;从而更好地理解和掌握口译技巧。此外&#xff0c;该系统还可以提供丰富的实景翻译素材&#xff…

scrapy模块的基础使用

scrapy模块是爬虫工作者最常用的一个模块之一&#xff0c;因它有许多好用的模板&#xff0c;和丰富的中间件&#xff0c;深受欢迎。 一&#xff0c;scrapy的安装 可以通过pypi的指引进行安装 在终端内输入以下代码&#xff1a; pip install scrapy 二&#xff0c;项目的建…

vcpkg安装opencv中的特殊问题记录(无法找到opencv_corexd.dll)

我是按照网上的vcpkg安装opencv方法进行的&#xff08;比如这篇&#xff1a;从0开始在visual studio上安装opencv&#xff08;超详细&#xff0c;针对小白&#xff09;&#xff09;&#xff0c;但是中间出现了一些别人没有遇到的问题&#xff0c;虽然原因没有找到&#xff0c;但…

springboot知识点大全

文章目录 LombokLombok介绍Lombok常用注解Lombok应用实例代码实现idea安装lombok插件 Spring InitializrSpring Initializr介绍Spring Initializr使用演示需求说明方式1: IDEA创建方式2: start.spring.io创建 注意事项和说明 yaml语法yaml介绍使用文档yaml基本语法数据类型字面…

联邦学习——学习笔记1:FedAvg算法

文章目录 本笔记参考自b站up主&#xff1a;丸一口 原视频链接 如上图&#xff0c;现有6个医院&#xff1a;眼科、儿科、妇科、骨科、综合医院1、综合医院2。中间节点为政府。 现政府要求用各个医院的数据训练某个模型&#xff0c;希望对某些疾病进行一些预测&#xff0c;数据…