MongoDB聚合:$set

聚合$set阶段可以为文档添加新的字段。$set输出的文档包含输入文档中的所有现有字段和新添加的字段。$set$addFields的别名,从MongoDB4.2开始支持。$set$addFields等价于$project阶段,这两个阶段都等同于 $project 阶段,后者明确指定输入文档中的所有现有字段并添加新字段。

语法

{ $set: { <newField>: <expression>, ... } }

指定要添加的每个字段的名称,并将其值设置为聚合表达式或空对象。

如果新字段的名称与现有字段的名称(包括 _id)相同,$set将用指定表达式的值覆盖该字段的现有值。

使用

  • 将新字段追加到现有文档中。可以在聚合操作中包含一个或多个$set阶段。
  • 接受对象嵌入,您可以将值设置为聚合表达式或空对象。例如,可接受嵌套对象:{$set:{ a:{ b: { }}}}
  • 要在嵌入文档(包括数组中的文档)中添加一个或多个字段,可以使用点符号。

例子

使用两个$set阶段

创建一个scores集合,并添加文档:

db.scores.insertMany([{ _id: 1, student: "Maya", homework: [ 10, 5, 10 ], quiz: [ 10, 8 ], extraCredit: 0 },{ _id: 2, student: "Ryan", homework: [ 5, 6, 5 ], quiz: [ 8, 8 ], extraCredit: 8 }
])

以下操作使用了两个$set阶段,在输出文档中加入三个新字段:

db.scores.aggregate( [{$set: {totalHomework: { $sum: "$homework" },totalQuiz: { $sum: "$quiz" }}},{$set: {totalScore: { $add: [ "$totalHomework", "$totalQuiz", "$extraCredit" ] } }}
] )

操作返回下面的文档:

{"_id" : 1,"student" : "Maya","homework" : [ 10, 5, 10 ],"quiz" : [ 10, 8 ],"extraCredit" : 0,"totalHomework" : 25,"totalQuiz" : 18,"totalScore" : 43
}
{"_id" : 2,"student" : "Ryan","homework" : [ 5, 6, 5 ],"quiz" : [ 8, 8 ],"extraCredit" : 8,"totalHomework" : 16,"totalQuiz" : 16,"totalScore" : 40
}

为内嵌文档增加字段

使用点符号为嵌入式文档添加新字段。

创建vehicles集合并添加如下内容:

db.vehicles.insertMany([{ _id: 1, type: "car", specs: { doors: 4, wheels: 4 } },{ _id: 2, type: "motorcycle", specs: { doors: 0, wheels: 2 } },{ _id: 3, type: "jet ski" }
])

下面的聚合操作在嵌入文档specs中添加一个新字段 fuel_type

db.vehicles.aggregate( [{ $set: { "specs.fuel_type": "unleaded" } }
] )

操作返回以下结果:

{ _id: 1, type: "car", specs: { doors: 4, wheels: 4, fuel_type: "unleaded" } }
{ _id: 2, type: "motorcycle", specs: { doors: 0, wheels: 2, fuel_type: "unleaded" } }
{ _id: 3, type: "jet ski", specs: { fuel_type: "unleaded" } }

覆盖已有字段

$set操作中指定一个已存在的字段,原有字段会被替换。创建一个animals集合:

db.animals.insertOne( { _id: 1, dogs: 10, cats: 15 } )

下面的$set聚合操作覆盖了cats字段:

db.animals.aggregate( [{ $set: { "cats": 20 } }
] )

操作返回以下文件:

{ _id: 1, dogs: 10, cats: 20 }

可以用一个字段替换另一个字段。在下面的示例中,item字段替代了_id字段。创建一个名为fruits的样本集合,其中包含以下文档:

db.fruits.insertMany([{ "_id" : 1, "item" : "tangerine", "type" : "citrus" },{ "_id" : 2, "item" : "lemon", "type" : "citrus" },{ "_id" : 3, "item" : "grapefruit", "type" : "citrus" }
])

下面的聚合操作使用$set将每个文档的_id字段替换为item字段的值,并将item字段替换为字符串"fruit"。

db.fruits.aggregate( [{ $set: { _id : "$item", item: "fruit" } }
] )

该操作的返回值如下:

{ "_id" : "tangerine", "item" : "fruit", "type" : "citrus" }
{ "_id" : "lemon", "item" : "fruit", "type" : "citrus" }
{ "_id" : "grapefruit", "item" : "fruit", "type" : "citrus" }

向数组中添加元素

创建scores集合,内容如下:

db.scores.insertMany([{ _id: 1, student: "Maya", homework: [ 10, 5, 10 ], quiz: [ 10, 8 ], extraCredit: 0 },{ _id: 2, student: "Ryan", homework: [ 5, 6, 5 ], quiz: [ 8, 8 ], extraCredit: 8 }
])

可以使用$set$concatArrays表达式配合使用,可向现有数组字段添加元素。例如,以下操作使用$sethomework字段替换为一个新数组,新数组的元素是homework数组与数组[7]元素合并后的结果。

db.scores.aggregate([{ $match: { _id: 1 } },{ $set: { homework: { $concatArrays: [ "$homework", [ 7 ] ] } } }
])

该操作的返回值如下:

{ "_id" : 1, "student" : "Maya", "homework" : [ 10, 5, 10, 7 ], "quiz" : [ 10, 8 ], "extraCredit" : 0 }

用现有字段重设新字段

创建scores集合,内容如下:

db.scores.insertMany([{ _id: 1, student: "Maya", homework: [ 10, 5, 10 ], quiz: [ 10, 8 ], extraCredit: 0 },{ _id: 2, student: "Ryan", homework: [ 5, 6, 5 ], quiz: [ 8, 8 ], extraCredit: 8 }
])

下面的聚合操作为每个文档添加了一个新字段quizAverage,其中包含quiz数组的平均值。

db.scores.aggregate( [{$set: {quizAverage: { $avg: "$quiz" }}}
] )
db.scores.aggregate( [{$set: {quizAverage: { $avg: "$quiz" }}}
] )

该操作返回如下文档:

[{_id: 1,student: 'Maya',homework: [ 10, 5, 10 ],quiz: [ 10, 8 ],extraCredit: 0,quizAverage: 9},{_id: 2,student: 'Ryan',homework: [ 5, 6, 5 ],quiz: [ 8, 8 ],extraCredit: 8,quizAverage: 8}
]

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

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

相关文章

黑马程序员——javase基础——day05——面向对象基础

目录&#xff1a; 面向对象 面向对象介绍为什么要用面向对象编程面向对象.重点学习什么?类和对象 什么是类什么是对象对象的属性和行为类的定义对象的使用学生类的定义和使用对象内存图 Java内存分配单个对象多个对象思考&#xff1a;多个引用指向相同成员变量和局部变量的区…

未来能源转型之路:2023年第十三届中国国际储能大会启示录

在2023年第十三届中国国际储能大会上&#xff0c;全球各地的能源专家、学者和企业代表齐聚一堂&#xff0c;共同探讨了储能技术在推动能源转型中的重要作用。对于我们普通人来说&#xff0c;从这场大会中可以学到什么呢&#xff1f; 一、储能技术是未来能源发展的关键 随着可再…

《剑指 Offer》专项突破版 - 面试题 15 : 字符串中的所有变位词(C++ 实现)

题目链接&#xff1a;LCR 015. 找到字符串中所有字母异位词 - 力扣&#xff08;LeetCode&#xff09; 题目&#xff1a; 输入字符串 s1 和 s2&#xff0c;如何找出字符串 s2 的所有变位词在字符串 s1 中的起始下标&#xff1f;假设两个字符串中只包含英文小写字母。例如&…

面试经典150题(88-89)

leetcode 150道题 计划花两个月时候刷完&#xff0c;今天&#xff08;第四十四天&#xff09;完成了2道(88-89)150&#xff1a; 88.(22. 括号生成) 题目描述&#xff1a; 数字 n 代表生成括号的对数&#xff0c;请你设计一个函数&#xff0c;用于能够生成所有可能的并且 有效…

(八)Java 循环结构 —— for、while、do...while

目录 一. 前言 二. Java 循环结构 2.1. for 循环 2.2. 增强 for 循环 2.3. while 循环 2.4. do…while 循环 2.5. continue 关键字 2.6. break 关键字 三. 课后习题 一. 前言 循环结构是指在程序中需要反复执行某个功能而设置的一种程序结构。它由循环体中的条件&…

html+js网页连接MQTT服务器new Paho.MQTT.Client

网页完整代码示例 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><meta http-equiv"X-UA-Compatible&quo…

YOLOv5改进 | 检测头篇 | 利用DynamicHead增加辅助检测头进行针对性检测(让小目标无所遁形)

一、本文介绍 本文给大家带来的改进机制是针对性的改进,针对于小目标检测增加P2层,利用DynamicHead(原版本一比一复现,全网独一份,不同于网上魔改版本)进行检测,其中我们增加P2层其拥有更高的分辨率,这使得模型能够更好地捕捉到小尺寸目标的细节。在这些的基础上配合Dyn…

Python爬虫实战014:利用requests库实现自动评论

文章目录 代码需要修改的参数如何修改headers 中的cookiedata中的contentdata中的articleId全网文章自动评论代码 import requests# 固定写法不要动 url = "https://blog.csdn.net/phoenix/web/v1/comment/submit" headers = {user-agent:

基于springboot+vue的社区团购系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目背景…

人工智能 AI 如何让我们的生活更加便利

每个人都可以从新技术中获益&#xff0c;一想到工作或生活更为便利、简捷且拥有更多空余时间&#xff0c;谁会不为之高兴呢&#xff1f;借助人工智能&#xff0c;每天能够多一些空余时间&#xff0c;或丰富自己的业余生活&#xff0c;为培养日常兴趣爱好增添一点便利。从电子阅…

【PostgreSQL】函数与操作符-数据类型格式化函数

PostgreSQL格式化函数提供一套强大的工具用于把各种数据类型 &#xff08;日期/时间、整数、浮点、数字&#xff09; 转换成格式化的字符串以及反过来从格式化的字符串转换成 指定的数据类型。下表列出了这些函数。这些函数都遵循一个公共的调用规范&#xff1a; 第一个参数是待…

Mybatis 分页

目录 一、Mybatis Plus 分页 1. 配置 &#xff08;1&#xff09;依赖 &#xff08;2&#xff09;创建MybatisPlusConfig配置类&#xff0c;配置分页插件 2. 纯代码分页查询 &#xff08;1&#xff09; 执行查询&#xff08;这里调用的是IService接口的page方法&#xff0…

微信小程序(六)tabBar的使用

注释很详细&#xff0c;直接上代码 新增内容&#xff1a; 1. 标签栏文字的内容以及默认与选中颜色 2. 标签栏图标的默认样式与选中样式 3. 标签选项路径页面 4.标签栏背景颜色 &#x1f43c;&#xff08;文末补充&#xff09;设置标签栏后为什么navigator标签无法跳转页面了 温…

【Dynamo学习笔记】Dynamo for Revit建模基础

目录 前言1 Revit模型的结构2 图元的操作2.1 图元的选择2.2 图元参数的读取和写入2.3 图元的创建2.3.2 创建轴网2.3.2 创建结构柱2.3.3 创建结构框架2.3.4 创建墙体 3 自定义节点 参考资料&#xff1a; &#xff08;1&#xff09; 罗嘉祥&#xff0c;宋姗&#xff0c;田宏钧. 《…

Baumer工业相机堡盟工业相机如何通过NEOAPI SDK使用相机日志跟踪功能(C#)

Baumer工业相机堡盟工业相机如何通过NEOAPI SDK使用相机日志跟踪功能&#xff08;C#&#xff09; Baumer工业相机Baumer工业相机NEOAPI SDK和短曝光功能的技术背景Baumer工业相机通过NEOAPI SDK使用相机日志跟踪功能1.引用合适的类文件2.通过NEOAPI SDK使用相机日志跟踪功能3.通…

burp靶场--ssrf

burp靶场–ssrf 1.什么是ssrf 服务器端请求伪造是一种 Web 安全漏洞&#xff0c;允许攻击者导致服务器端应用程序向非预期位置发出请求。 在典型的 SSRF 攻击中&#xff0c;攻击者可能会导致服务器连接到组织基础设施内的仅供内部使用的服务。在其他情况下&#xff0c;他们可…

python数字图像处理基础(七)——直方图均衡化、傅里叶变换

目录 直方图均衡化均衡化原理均衡化效果标准直方图均衡化自适应直方图均衡化 傅里叶变换原理低通滤波高通滤波 直方图均衡化 均衡化原理 图像均衡化是一种基本的图像处理技术&#xff0c;通过更新图像直方图的像素强度分布来调整图像的全局对比度。这样做可以使低对比度的区域…

Docker安装开源Blog(Typecho)

前言 首先这个镜像是centos7.9进行安装PHP环境&#xff0c;然后挂载目录去运行的&#xff0c;镜像大概300MB左右&#xff0c;没学过PHP&#xff0c;没办法给Dockerfile文件 参考文章&#xff1a;Docker安装Typecho | D-y Blog感知不强&#xff0c;图一乐https://www.wlul.top…

IntelliJ IDEA 拉取gitlab项目

一、准备好Gitlab服务器及项目 http://192.168.31.104/root/com.saas.swaggerdemogit 二、打开 IntelliJ IDEA安装插件 打开GitLab上的项目&#xff0c;输入项目地址 http://192.168.31.104/root/com.saas.swaggerdemogit 弹出输入登录用户名密码&#xff0c;完成。 操作Comm…

学习JavaEE的日子 day13 封装 static private this 类加载机制

Day13 1. private – 私有化 理解&#xff1a;private是访问修饰符的一种&#xff0c;访问修饰符规定了访问权限. 作用&#xff1a; ​ 1.private修饰属性&#xff1a;该属性只能在类的内部使用 ​ 2.private修饰方法&#xff1a;该方法只能在类的内部使用 应用场景&#xff1…