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表达式配合使用,可向现有数组字段添加元素。例如,以下操作使用$set将homework字段替换为一个新数组,新数组的元素是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}
]
相关文章:
MongoDB聚合:$set
聚合$set阶段可以为文档添加新的字段。$set输出的文档包含输入文档中的所有现有字段和新添加的字段。$set是$addFields的别名,从MongoDB4.2开始支持。$set和$addFields等价于$project阶段,这两个阶段都等同于 $project 阶段,后者明确指定输入…...
《Python数据分析技术栈》第01章 02 Jupyter入门(Getting started with Jupyter notebooks)
02 Jupyter入门(Getting started with Jupyter notebooks) 《Python数据分析技术栈》第01章 02 Jupyter入门(Getting started with Jupyter notebooks) Before we discuss the essentials of Jupyter notebooks, let us discuss…...
【征服redis5】redis的Redisson客户端
目录 1 Redisson介绍 2. 与其他Java Redis客户端的比较 3.基本的配置与连接池 3.1 依赖和SDK 3.2 配置内容解析 4 实战案例:优雅的让Hash的某个Field过期 5 Redisson的强大功能 1 Redisson介绍 Redisson 最初由 GitHub 用户 “mrniko” 创建,并在…...
React16源码: React中的beginWork的源码实现
beginWork 1 )概述 在 renderRoot 之后,要对我们的 Fiber 树每一个节点进行对应的更新更新节点的一个入口方法,就是 beginWork这个入口方法会有帮助我们去优化整棵树的更新过程 react 它的节点其实是非常多的,如果每一次子节点的…...
5-微信小程序语法参考
1. 数据绑定 官网传送门 WXML 中的动态数据均来自对应 Page 的 data。 数据绑定使用 Mustache 语法(双大括号)将变量包起来 ts Page({data: {info: hello wechart!,msgList: [{ msg: hello }, { msg: wechart }]}, })WXML <view class"vie…...
数组练习 Leetcode 566.重塑矩阵
在 MATLAB 中,有一个非常有用的函数 reshape ,它可以将一个 m x n 矩阵重塑为另一个大小不同(r x c)的新矩阵,但保留其原始数据。 给你一个由二维数组 mat 表示的 m x n 矩阵,以及两个正整数 r 和 c &#…...
Linux centos中find命令的多种用途:按照具体应用来详细说明find的用法举例
目录 一、find命令 二、find命令的语法 (一)语法格式 (二)选项 1、选项(option)介绍 2、控制符号链接的option 3、调试选项debugopts 4、优化选项 (三)表达式expression 1、选项options 2、测试…...
服务器数据恢复—OceanStor存储raid5热备盘同步数据失败的数据恢复案例
服务器数据恢复环境: 华为OceanStor某型号存储,存储内有一组由24块硬盘组建的raid5阵列,配置1块热备盘。 服务器故障: 该存储raid5阵列中有一块硬盘离线,热备盘自动激活并开始同步数据,在热备盘同步数据的…...
Xline v0.6.1: 一个用于元数据管理的分布式KV存储
Xline是什么?我们为什么要做Xline? Xline是一个基于Curp协议的,用于管理元数据的分布式KV存储。现有的分布式KV存储大多采用Raft共识协议,需要两次RTT才能完成一次请求。当部署在单个数据中心时,节点之间的延迟较低&a…...
【CSS】解决height = line-height 文字不垂直居中(偏上、偏下)的问题
解决办法1: 查看 font-family 属性,确认是否是因为字体而导致的不垂直居中问题。 其他小知识: 基线就是小写x字母的下边缘(线) 就是我们常说的 基线。line-height 属性设置的行高也就是定义的两行文字基线之间的距离! 参考文章:…...
天津想转行学python培训班靠谱吗?
现在的职业如此繁多,很多人把高薪当成衡量工作好坏的重要标准,因此IT行业以超出其他行业几倍薪资水平成为不错的选择,而Python又以其简单易学好上手成为大家所青睐的学习目标。 Python发展前景如何 Python语言就业发展方向广泛:…...
(C语言)冒泡排序
一、运行结果; 二、源代码; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>//实现buble_sort函数; void buble_sort(int arr[], int sz) {//初始化变量值;int i 0;//嵌套循环冒泡排序;//外层循环&…...
怎么样的布局是符合可制造性的PCB布局?
满足可制造性、可装配性、可维修性要求,方便调试的时候于检测和返修,能够方便的拆卸器件: 1)极性器件的方向不要超过2种,最好都进行统一方向等要求,如图1-1所示; 图1-1 极性器件方向统一摆放 2…...
第28关 k8s监控实战之Prometheus(九)
------> 课程视频同步分享在今日头条和B站 大家好,我是博哥爱运维。早期我们经常用邮箱接收报警邮件,但是报警不及时,而且目前各云平台对邮件发送限制还比较严格,所以目前在生产中用得更为多的是基于webhook来转发报警内容到企…...
安全防御之可信计算技术
可信计算技术是一种计算机安全体系结构,旨在提高计算机系统在面临各种攻击和威胁时的安全性和保密性。它通过包括硬件加密、受限访问以及计算机系统本身的完整性验证等技术手段,确保计算机系统在各种攻击和威胁下保持高度安全和保密性。 一、可信计算基…...
FPGA引脚物理电平(内部资源,Select IO)-认知2
引脚电平 The SelectIO pins can be configured to various I/O standards, both single-ended and differential. • Single-ended I/O standards (e.g., LVCMOS, LVTTL, HSTL, PCI, and SSTL) • Differential I/O standards (e.g., LVDS, Mini_LVDS, RSDS, PPDS, BLVDS, and…...
PBR材质纹理下载
03:10 按照视频里的顺序 我们从第6个网站开始倒数 点击本行文字或下方链接 进入查看 6大网站地址 网址查看链接: http://www.uzing.net/community_show-1962-48-48-35.html 06 Tectures Wood Fence 001 | 3D TEXTURES 简介:最大的纹理网站之一&#x…...
mac PyCharm 使用conda环境
1 使用conda创建虚拟环境 conda create -n test6 python3.9 -y conda activate test62 选择conda环境 本地 选择已经存在的conda环境 右下角会显示现在的环境。...
10个常用的正则表达式
1 电话号码 let r1 /^1[3-9]\d{9}$/g console.log(r1.exec(18596932371)) 2 qq号 let r2 /^[1-9][0-9]{4,9}$/g console.log(r2.exec(123456)) 3 十六进制的方式表示颜色 let r3 /^#([0-9a-fA-F]{6}|[0-9a-fA-F]{3})$/g // # 可能可有可无,如果不需要#&a…...
对一手游的自定义 luajit 字节码的研究
对一手游的自定义 luajit 字节码的研究 前言 最近闲下来之后无聊研究起了一个unity手游 大量使用了 lua (或者说就是 lua 写的 ) 看到网上已有的一些针对方案 都觉得太不方便 于是深入研究了一下 他自定义的 luajit 情况研究 首先 这是一个 unity的 传…...
nba篮球数据项目书
import pandas as pd import randomdef get_2000_nba_players():"""生成2000条NBA球员数据(基于真实球员名 合理数据)100%成功,无需网络请求"""# 真实NBA球员名(前200名真实球员)real_…...
SEO_中小企业如何低成本做好SEO?实用方案分享
为什么中小企业需要关注SEO 在当今数字化经济时代,中小企业如果想要在竞争激烈的市场中脱颖而出,关注SEO(搜索引擎优化)是必不可少的。SEO不仅能够提升网站的搜索引擎排名,还能有效带来更多的潜在客户。许多中小企业在…...
关系型数据库星型模型聚合表生成
在关系型数据库(MySQL、Oracle、SQL Server等)中,通过星型模型模拟多维分析结构,高效生成聚合表,解决报表查询慢、多维分析繁琐、实时计算压力大等核心痛点。 一、前置基础 星型模型是关系型数据库模拟多维结构的最优方…...
Oracle Ogg集成模式升级全攻略:从条件检查到性能优化
Oracle GoldenGate集成模式升级实战手册:从条件预检到调优全解析 在数据同步技术领域,Oracle GoldenGate(OGG)的集成模式代表着新一代架构设计方向。与经典模式相比,集成模式深度整合了数据库内核级特性,在…...
3分钟搭建你的微信智能管家:零代码实现24小时自动回复
3分钟搭建你的微信智能管家:零代码实现24小时自动回复 【免费下载链接】WechatBot 项目地址: https://gitcode.com/gh_mirrors/wechatb/WechatBot 想要一个能帮你自动处理微信消息的智能助手吗?WechatBot微信机器人让你在3分钟内拥有一个全天候在…...
实战部署JetBrains IDE试用期重置:自动化清理与插件开发全流程
实战部署JetBrains IDE试用期重置:自动化清理与插件开发全流程 【免费下载链接】ide-eval-resetter 项目地址: https://gitcode.com/gh_mirrors/id/ide-eval-resetter JetBrains IDE试用期重置工具是一个开源项目,专门用于清除IntelliJ IDEA、Py…...
如何统计不同电话号码的个数?—位图法
在技术领域,我们常常被那些闪耀的、可见的成果所吸引。今天,这个焦点无疑是大语言模型技术。它们的流畅对话、惊人的创造力,让我们得以一窥未来的轮廓。然而,作为在企业一线构建、部署和维护复杂系统的实践者,我们深知…...
如何让AI读懂古文?GuwenBERT带来的古典汉语处理革命
如何让AI读懂古文?GuwenBERT带来的古典汉语处理革命 【免费下载链接】guwenbert GuwenBERT: 古文预训练语言模型(古文BERT) A Pre-trained Language Model for Classical Chinese (Literary Chinese) 项目地址: https://gitcode.com/gh_mir…...
3步掌握本地语音合成:tts-vue离线语音包配置终极指南
3步掌握本地语音合成:tts-vue离线语音包配置终极指南 【免费下载链接】tts-vue 🎤 微软语音合成工具,使用 Electron Vue ElementPlus Vite 构建。 项目地址: https://gitcode.com/gh_mirrors/tt/tts-vue 还在为网络不稳定导致的语音…...
3步破解微信记录管理难题:WeChatMsg如何重新定义数字记忆保存?
3步破解微信记录管理难题:WeChatMsg如何重新定义数字记忆保存? 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHu…...
