MongoDB聚合运算符:$setField

MongoDB聚合运算符:$setField

文章目录

  • MongoDB聚合运算符:$setField
    • 语法
      • 字段说明
    • 使用
    • 举例
      • 添加包含点号 (.) 的字段
      • 添加以($)开头的字段
      • 更新包含(.)的字段
      • 更新以($)开头的字段
      • 删除包含(.)的字段
      • 删除以($)开头的字段

$setField聚合运算符用于添加、更新、删除文档中的指定字段,可以用于字段名称包含 .或以 $开头的字段。从5.0版本开始支持。

语法

{$setField: {field: <String>,input: <Object>,value: <Expression>}
}

字段说明

字段类型说明
field字符串要添加、更新或删除的输入对象中的字段,字段可以是字符串表达式
input对象指定要更新的文档,input必须是可以解析为文档的对象、缺失、空或未定义
value表达式要分配给field的值,value可以是任何有效的表达式,如果设置为$$REMOVE,则会从输入文档中删除字段

使用

  • 如果input的计算结果为缺失、undefinednull,则 $setField 返回 null 并且不更新input

  • 如果input的计算结果为除对象、缺失、undefinednull 之外的任何内容,则 $setField 将返回错误。

  • 如果 field 解析为字符串常量以外的任何内容,则 $setField 返回错误。

  • 如果input中不存在field$setField将添加一个field

  • $setField不会隐式遍历对象或数组,例如 $setField 将字段值"a.b.c"计算为顶级字段"a.b.c",而不是嵌套字段 { "a": { "b": { "c": } } }

  • $unsetField 是输入值为 $$REMOVE$setField 的别名。以下表达式是等效的:

     {$setField: {field: <field name>,input: “$$ROOT,value: "$$REMOVE"}}{$unsetField: {field: <field name>,input: “$$ROOT}}
    

举例

添加包含点号 (.) 的字段

使用下面的脚本创建inventory集合:

db.inventory.insertMany( [{ "_id" : 1, "item" : "sweatshirt", price: 45.99, qty: 300 }{ "_id" : 2, "item" : "winter coat", price: 499.99, qty: 200 }{ "_id" : 3, "item" : "sun dress", price: 199.99, qty: 250 }{ "_id" : 4, "item" : "leather boots", price: 249.99, qty: 300 }{ "_id" : 5, "item" : "bow tie", price: 9.99, qty: 180 }
] )

下面的聚合操作使用 $replaceWith 管道阶段和 $setField 操作符为每个文档添加一个新字段 "price.usd""price.usd" 的值将等于每个文档 "price"的值。最后,使用 $unset 管道阶段删除 "price"字段:

db.inventory.aggregate( [{ $replaceWith: {$setField: {field: "price.usd",input: "$$ROOT",value: "$price"} } },{ $unset: "price" }
] )

操作返回下面的结果:

[{ _id: 1, item: 'sweatshirt', qty: 300, 'price.usd': 45.99 },{ _id: 2, item: 'winter coat', qty: 200, 'price.usd': 499.99 },{ _id: 3, item: 'sun dress', qty: 250, 'price.usd': 199.99 },{ _id: 4, item: 'leather boots', qty: 300, 'price.usd': 249.99 },{ _id: 5, item: 'bow tie', qty: 180, 'price.usd': 9.99 }
]

添加以($)开头的字段

使用下面的脚本创建inventory集合:

db.inventory.insertMany( [{ "_id" : 1, "item" : "sweatshirt", price: 45.99, qty: 300 }{ "_id" : 2, "item" : "winter coat", price: 499.99, qty: 200 }{ "_id" : 3, "item" : "sun dress", price: 199.99, qty: 250 }{ "_id" : 4, "item" : "leather boots", price: 249.99, qty: 300 }{ "_id" : 5, "item" : "bow tie", price: 9.99, qty: 180 }
] )

以下聚合操作使用 $replaceWith 管道阶段以及 $setField$literal 运算符向每个文档添加新字段"$price""$price"的值等于每个文档中"price"的值,最后使用 $unset 管道阶段删除"price"字段:

db.inventory.aggregate( [{ $replaceWith: {$setField: {field: { $literal: "$price" },input: "$$ROOT",value: "$price"} } },{ $unset: "price" }
] )

操作返回下面的结果:

[{ _id: 1, item: 'sweatshirt', qty: 300, '$price': 45.99 },{ _id: 2, item: 'winter coat', qty: 200, '$price': 499.99 },{ _id: 3, item: 'sun dress', qty: 250, '$price': 199.99 },{ _id: 4, item: 'leather boots', qty: 300, '$price': 249.99 },{ _id: 5, item: 'bow tie', qty: 180, '$price': 9.99 }
]

更新包含(.)的字段

使用下面的脚本创建inventory集合:

db.inventory.insertMany( [{ _id: 1, item: 'sweatshirt', qty: 300, 'price.usd': 45.99 },{ _id: 2, item: 'winter coat', qty: 200, 'price.usd': 499.99 },{ _id: 3, item: 'sun dress', qty: 250, 'price.usd': 199.99 },{ _id: 4, item: 'leather boots', qty: 300, 'price.usd': 249.99 },{ _id: 5, item: 'bow tie', qty: 180, 'price.usd': 9.99 }
] )

下面的聚合操作使用 $match 管道阶段查找制定的文档,并使用 $replaceWith 管道阶段和 $setField 运算符更新匹配文档中的"price.usd"字段:

db.inventory.aggregate( [{ $match: { _id: 1 } },{ $replaceWith: {$setField: {field: "price.usd",input: "$$ROOT",value: 49.99} } }
] )

操作返回下面的结果:

[{ _id: 1, item: 'sweatshirt', qty: 300, 'price.usd': 49.99 }
]

更新以($)开头的字段

使用下面的脚本创建inventory集合:

db.inventory.insertMany([{ _id: 1, item: 'sweatshirt', qty: 300, '$price': 45.99 },{ _id: 2, item: 'winter coat', qty: 200, '$price': 499.99 },{ _id: 3, item: 'sun dress', qty: 250, '$price': 199.99 },{ _id: 4, item: 'leather boots', qty: 300, '$price': 249.99 },{ _id: 5, item: 'bow tie', qty: 180, '$price': 9.99 }
] )

以下操作使用 $match 管道阶段来查找文档,并使用 $replaceWith 管道阶段以及 $setField$literal 运算符来更新匹配文档中的"$price"字段:

db.inventory.aggregate( [{ $match: { _id: 1 } },{ $replaceWith: {$setField: {field: { $literal: "$price" },input: "$$ROOT",value: 49.99} } }
] )

操作返回下面的结果:

[{ _id: 1, item: 'sweatshirt', qty: 300, '$price': 49.99 }
]

删除包含(.)的字段

使用下面的脚本创建inventory集合:

db.inventory.insertMany([{ _id: 1, item: 'sweatshirt', qty: 300, 'price.usd': 45.99 },{ _id: 2, item: 'winter coat', qty: 200, 'price.usd': 499.99 },{ _id: 3, item: 'sun dress', qty: 250, 'price.usd': 199.99 },{ _id: 4, item: 'leather boots', qty: 300, 'price.usd': 249.99 },{ _id: 5, item: 'bow tie', qty: 180, 'price.usd': 9.99 }
] )

以下操作使用 $replaceWith 管道阶段、$setField 操作符和 $$REMOVE 从文档中删除 "price.usd"字段::

db.inventory.aggregate( [{ $replaceWith:  {$setField: {field: "price.usd",input: "$$ROOT",value: "$$REMOVE"} } }
] )

操作返回下面的结果:

[{ _id: 1, item: 'sweatshirt', qty: 300 },{ _id: 2, item: 'winter coat', qty: 200 },{ _id: 3, item: 'sun dress', qty: 250 },{ _id: 4, item: 'leather boots', qty: 300 },{ _id: 5, item: 'bow tie', qty: 180 }
]

使用 $unsetField 也可以完成查询返回相同的结果:

db.inventory.aggregate( [{ $replaceWith:  {$unsetField: {field: "price.usd",input: "$$ROOT"} } }
] )

删除以($)开头的字段

使用下面的脚本创建inventory集合:

db.inventory.insertMany( [{ _id: 1, item: 'sweatshirt', qty: 300, '$price': 45.99 },{ _id: 2, item: 'winter coat', qty: 200, '$price': 499.99 },{ _id: 3, item: 'sun dress', qty: 250, '$price': 199.99 },{ _id: 4, item: 'leather boots', qty: 300, '$price': 249.99 },{ _id: 5, item: 'bow tie', qty: 180, '$price': 9.99 }
} )

以下操作使用 $replaceWith 管道阶段、$setField$literal 运算符以及 $$REMOVE 删除文档中的"$price"字段:

db.inventory.aggregate( [{ $replaceWith: {$setField: {field: { $literal: "$price" },input: "$$ROOT",value: "$$REMOVE"} } }
] )

操作返回下面的结果:

[{ _id: 1, item: 'sweatshirt', qty: 300 },{ _id: 2, item: 'winter coat', qty: 200 },{ _id: 3, item: 'sun dress', qty: 250 },{ _id: 4, item: 'leather boots', qty: 300 },{ _id: 5, item: 'bow tie', qty: 180 }
]

使用 $unsetField 可以实现相同的效果:

db.inventory.aggregate( [{ $replaceWith: {$unsetField: {field: { $literal: "$price" },input: "$$ROOT"} } }
] )

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

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

相关文章

打开新世界大门!淘宝商品关键词搜索电商API接口解密

淘宝商城作为全球最大的电子商务平台之一&#xff0c;为数以亿计的消费者提供了广泛的商品选择和购物体验。然而&#xff0c;对于开发者来说&#xff0c;如何利用淘宝平台的资源进行开发和推广是一个关键的问题。幸运的是&#xff0c;联讯数据淘宝电商API的出现为开发者打开了通…

X-Spider媒体下载工具

软件介绍 X-Spider 是一个功能丰富的推特媒体下载器&#xff0c;它不仅可以帮助用户从推特上下载图片和视频&#xff0c;还提供了一些高级的过滤功能。例如&#xff0c;用户可以通过指定日期范围来筛选需要下载的媒体文件&#xff0c;并且可以跳过已下载的重复文件&#xff0c…

【Linux】文件描述符——万字详解

目录 前言 预备知识 复习C语言的文件接口 写方式打开文件 追加方式打开文件 读方式打开文件 系统的文件接口 open close write read 文件描述符 0 & 1 & 2 理解文件描述符 文件描述符的分配规则 重定向的本质 dup2 理解Linux下一切皆文件 缓冲区…

WordPress 谷歌SEO是否还有必要做?又该如何做?

一、引言 在全球化的大潮中&#xff0c;外贸行业日益繁荣&#xff0c;竞争也愈发激烈。为了在激烈的市场竞争中脱颖而出&#xff0c;许多外贸企业纷纷将目光投向了谷歌SEO。然而&#xff0c;随着互联网的快速发展和搜索引擎算法的不断更新&#xff0c;一些人开始质疑谷歌SEO是…

STM32F4 Hal库中IO外部中断(EXIT)的应用

目录 概述 1 中断和事件 1.1 外部中断/事件控制器 (EXTI) 1.2 EXTI主要特性 1.3 中断和事件的差别 1.3.1 中断产生流程 1.3.2 事件产生流程 1.3.3 STM32F4的事件 2 STM32Cube配置工程 2.1 外部中断/事件介绍 2.2 配置参数 2.3 生成Project 3 STM32F4 Hal库中外部中…

在使用电脑时遇过msvcr120.dll文件丢失的情况怎么办,一键修复dll文件丢失

在使用电脑时有没有遇到过msvcr120.dll文件丢失的情况&#xff0c;遇到这样的情况有什么办法可以解决&#xff0c;废话少说&#xff0c;直接上教程&#xff0c;解决msvcr120.dll文件丢失问题。 msvcr120.dll文件丢失修复方法 A. 从官方或其他可信赖的来源下载并安装缺失的 msv…

众筹商城源码 众筹农业平台 农业乘科技富强之路 线上农业众筹 养殖系统 种植系统源码

内容目录 一、详细介绍二、效果展示1.部分代码2.效果图展示 三、学习资料下载 一、详细介绍 前端是编译后的&#xff0c;后端PHP&#xff0c;带商城&#xff0c;详情看下图 特点和功能&#xff1a; 用户管理&#xff1a;包括注册、登录、个人信息管理等。 项目创建与展示&…

C++orm使用插曲——MySQL保留字

近日开始对数据库开始涉猎&#xff0c;在编写数据库操作类调试过程中遇到一个问题&#xff1a; mysql> select * from environmental_variable_table where keytemperature AND dev_ip192.168.1.1; 1064 - You have an error in your SQL syntax; check the manual that co…

【C语言进阶篇】offsetof宏的介绍 及其实现

目录 一、offsetof宏的介绍 头文件 &#xff1a; offsetof宏的通用形式&#xff1a; 参数说明&#xff1a; 用法举例&#xff1a; 二、offsetof宏的实现 三、offsetof宏的使用注意事项 个人主页&#xff1a; 倔强的石头的博客 系列专栏 &#xff1a;C语言指南 …

Java中的动态代理

动态代理 什么是代理程序为什么需要代理例子如何创建代理对象 应用场景 什么是代理 程序为什么需要代理 对象如果认为身上干的事太多&#xff0c;可以通过代理来转移部分职责&#xff1b; 对象有什么方法想被代理&#xff0c;代理就一定要有对应的方法 使用接口实现&#xf…

iPerf 3 测试UDP和TCP方法详解

文章目录 前言一、What is iPerf / iPerf3 ?二、功能1. TCP and SCTP2. UDP3. 其他 三、 Iperf的使用1.Iperf的工作模式2. 通用指令3. 服务端特有选项4. 客户端特有选项5. -t -n参数联系 四、Iperf使用实例1. 调整 TCP 连接1. 1TCP 窗口大小调节1. 2 最大传输单元 (MTU)调整 2…

Pyhton Sqlite3手机数据库

代码结果 Code import sqlite3 connsqlite3.connect(test.db) csconn.cursor() create_tb_sqlcreate table if not exists info(id int primary key,name text,age int)cs.execute(create_tb_sql)# cs.execute(insert into info(id,name,age) values(3,"dog_Senior&quo…

华为交换机重置密码

1.进入bootrom 加电后&#xff0c;18S左右&#xff0c;在启动菜单按 CtrlB 进入bootrom&#xff08;3s内&#xff09; 注意&#xff1a;本步骤属于高危操作&#xff0c;一定小心切勿删除系统或修改bootrom密码&#xff01; 输入bootrom密码&#xff0c;按6 看到提示成功后按…

科技云报道:AIGC掀算力需求革命,边缘计算将不再“边缘”

科技云报道原创。 随着以大模型为代表的AIGC时代拉开序幕&#xff0c;算力需求持续爆发&#xff0c;AI与边缘深度融合已是大势所趋&#xff0c;越来越多的企业开始积极布局GenAI。 GenAI技术的商用化部署和应用成为企业竞逐的新阵地&#xff0c;勾勒出大模型从“技术力”转向…

web漏洞合集描述和修复建议

完整Excle文件可移步至知识星球查看下载 星球不定时分享网上各种资料&#xff0c;欢迎大家加入交流。

MongoDB聚合运算符:$setIntersection

MongoDB聚合运算符&#xff1a;$setIntersection 文章目录 MongoDB聚合运算符&#xff1a;$setIntersection语法使用举例元素数组举例检索授予当前用户角色的文档创建角色创建用户创建集合使用John登录检索文档检查文档使用Jane登录检索文档验证文档 $setIntersection聚合运算符…

NX二次开发UF_LAYER(图层相关操作)常用函数

目录 一、概述 二、函数的介绍 2.1 UF_LAYER_ask_category_info &#xff08;查询图层类别信息&#xff09; 2.2 UF_LAYER_ask_category_tag&#xff08;查询图层类别TAG&#xff09; 2.3 UF_LAYER_ask_status&#xff08;查询图层的状态&#xff09; 2.4 UF_LAYER_ask_wo…

在终端使用DOCKER部署ollama

什么是ollama&#xff0c;可以看作管理AI模型的一个命令行工具 ollama -h 可以查看帮助&#xff0c;可以进行删减&#xff0c;下载启动等操作 这里主要使用DOCKER部署ollama&#xff0c;这样即可兼容windows 苹果 Linux 系统 这里我主要介绍在Linux 系统下部署 1. 首先是安…

组件挂载:虚拟DOM如何转化为真实DOM

在React中&#xff0c;当组件首次挂载时&#xff0c;虚拟DOM会被创建并被用来描述组件的UI结构。虚拟DOM是一个JavaScript对象&#xff0c;它是轻量级的、独立于平台的表示。虚拟DOM是React使用的一个重要概念&#xff0c;它允许React在更新UI时更高效地进行比较和渲染操作。 …