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

MongoDB CRUD操作:投影Project详解

MongoDB CRUD操作:投影Project详解

文章目录

  • MongoDB CRUD操作:投影Project详解
    • 返回文档的全部字段
    • 返回指定的字段和_id字段
    • 不输出_id字段
    • 指定排除的字段
    • 返回内嵌文档中的指定字段
    • 禁止内嵌文档中的特定字段
    • 数组中内嵌文档的投影
    • 聚合表达式的投影字段

默认情况下,MongoDB查询返回文档中的所有字段,通过project可以限制MongoDB发送到应用程序的文档的字段。

下面的示例使用mongosh的db.collection.find()方法对内嵌/嵌套文档进行查询,如果使用其他编程语言或驱动,写法会有不同。

首先,使用下面的语句创建inventory集合:

db.inventory.insertMany( [{ item: "journal", status: "A", size: { h: 14, w: 21, uom: "cm" }, instock: [ { warehouse: "A", qty: 5 } ] },{ item: "notebook", status: "A",  size: { h: 8.5, w: 11, uom: "in" }, instock: [ { warehouse: "C", qty: 5 } ] },{ item: "paper", status: "D", size: { h: 8.5, w: 11, uom: "in" }, instock: [ { warehouse: "A", qty: 60 } ] },{ item: "planner", status: "D", size: { h: 22.85, w: 30, uom: "cm" }, instock: [ { warehouse: "A", qty: 40 } ] },{ item: "postcard", status: "A", size: { h: 10, w: 15.25, uom: "cm" }, instock: [ { warehouse: "B", qty: 15 }, { warehouse: "C", qty: 35 } ] }
]);

返回文档的全部字段

如果不指定文档投影,则db.collection.find()方法将返回匹配文档中的所有字段。下面的示例返回inventory集合中status"A"的文档的全部字段:

db.inventory.find( { status: "A" } )

这个操作等价于SQL语句:

SELECT * from inventory WHERE status = "A"

返回指定的字段和_id字段

在投影文档中将<field>设置为1,可以显式包含多个字段,下面的操作返回itemstatus以及默认的_id字段。

db.inventory.find( { status: "A" }, { item: 1, status: 1 } )

该操作等价于SQL语句:

SELECT _id, item, status from inventory WHERE status = "A"

不输出_id字段

可以通过在投影中将_id字段设置为0,从而在结果中删除——id字段,如下例所示:

db.inventory.find( { status: "A" }, { item: 1, status: 1, _id: 0 } )

该操作等价于SQL语句:

SELECT item, status from inventory WHERE status = "A"

_id字段外,不能在投影文档中同时指定输出和排除的字段。

指定排除的字段

可以使用投影来排除特定字段,而不是列出要在匹配文档中返回的字段,下面的示例返回匹配文档中除statusinstock字段之外的所有字段,也就是排除这两个字段:

db.inventory.find( { status: "A" }, { status: 0, instock: 0 } )

返回内嵌文档中的指定字段

可以返回内嵌文档的特定字段,使用点号(.)引用内嵌字段并在投影文档中设置为1

下面的示例返回:

  • _id字段(默认返回),
  • item字段,
  • status字段,
  • size文档中的uom字段。
  • uom字段仍然内嵌在size文档中。
db.inventory.find({ status: "A" },{ item: 1, status: 1, "size.uom": 1 }
)

还可以使用嵌套形式指定内嵌字段。例如,

{ item: 1, status: 1, size: { uom: 1 } }

禁止内嵌文档中的特定字段

可以使用点号.引用投影文档中的内嵌字段并设置为0来隐藏内嵌文档的特定字段。

下面的示例指定一个投影来排除size文档内的uom字段。所有其他字段都在匹配文档中返回:

db.inventory.find({ status: "A" },{ "size.uom": 0 }
)

还可以使用嵌套形式指定内嵌字段。例如:

{ size: { uom: 0 } }

数组中内嵌文档的投影

使用点号.表示投影数组中内嵌文档的特定字段。

以下示例指定要返回的投影:

  • _id 字段(默认返回),
  • item字段,
  • status字段,
  • instock数组中内嵌文档的qty数量字段。
db.inventory.find( { status: "A" }, { item: 1, status: 1, "instock.qty": 1 } )

$elemMatch、$slice$是投影特定元素以包含在返回的数组中的唯一方法。例如,不能使用数组索引来投影特定的数组元素;例如{ "instock.0": 1 }投影不会用第一个元素投影数组。

聚合表达式的投影字段

可以在查询投影中指定聚合表达式。聚合表达式允许投影新字段并修改现有字段的值。

例如,下面的操作使用聚合表达式覆盖status字段的值,并投影新字段areareportNumber

db.inventory.find({ },{_id: 0,item: 1,status: {$switch: {branches: [{case: { $eq: [ "$status", "A" ] },then: "Available"},{case: { $eq: [ "$status", "D" ] },then: "Discontinued"},],default: "No status found"}},area: {$concat: [{ $toString: { $multiply: [ "$size.h", "$size.w" ] } }," ","$size.uom"]},reportNumber: { $literal: 1 }}
)

输出结果:

[{item: 'journal',status: 'Available',area: '294 cm',reportNumber: 1},{item: 'planner',status: 'Discontinued',area: '685.5 cm',reportNumber: 1},{item: 'notebook',status: 'Available',area: '93.5 in',reportNumber: 1},{item: 'paper',status: 'Discontinued',area: '93.5 in',reportNumber: 1},{item: 'postcard',status: 'Available',area: '152.5 cm',reportNumber: 1}
]

相关文章:

  • os模块概述及常用方法
  • 【SQL学习进阶】从入门到高级应用(一)
  • 什么是GPT-4o,推荐GPT-4o的获取使用方法,使用GPT4o模型的最新方法教程(2024年5月16更新)
  • 【算法】Angelic Jelly天使果冻
  • Vue从入门到实战Day12~14 - Vue3大事件管理系统
  • 数据挖掘与机器学习——回归分析
  • LeetCode---链表
  • 串口环保212设备 转 profinet IO协议项目案例
  • Diffusion Model, Stable Diffusion, Stable Diffusion XL 详解
  • 前后端分离跨域问题解决方案
  • MagicPose4D:解锁AI驱动的3D模型动作新纪元
  • [C#]winform部署官方yolov10目标检测的onnx模型
  • 【Qt秘籍】[003]-Qt环境变量配置-磨刀不误砍柴工
  • [FlareOn6]Overlong
  • 知识分享:大数据信用花导致的评分不足多久能恢复
  • 230. Kth Smallest Element in a BST
  • 4月23日世界读书日 网络营销论坛推荐《正在爆发的营销革命》
  • Android开源项目规范总结
  • Docker下部署自己的LNMP工作环境
  • eclipse(luna)创建web工程
  • JAVA_NIO系列——Channel和Buffer详解
  • Nacos系列:Nacos的Java SDK使用
  • October CMS - 快速入门 9 Images And Galleries
  • react-native 安卓真机环境搭建
  • 大整数乘法-表格法
  • 理解IaaS, PaaS, SaaS等云模型 (Cloud Models)
  • 聊聊directory traversal attack
  • 聊聊hikari连接池的leakDetectionThreshold
  • 浅析微信支付:申请退款、退款回调接口、查询退款
  • 入门级的git使用指北
  • raise 与 raise ... from 的区别
  • ​3ds Max插件CG MAGIC图形板块为您提升线条效率!
  • ​软考-高级-系统架构设计师教程(清华第2版)【第1章-绪论-思维导图】​
  • ​中南建设2022年半年报“韧”字当头,经营性现金流持续为正​
  • #07【面试问题整理】嵌入式软件工程师
  • #HarmonyOS:基础语法
  • (04)odoo视图操作
  • (11)iptables-仅开放指定ip访问指定端口
  • (160)时序收敛--->(10)时序收敛十
  • (2)nginx 安装、启停
  • (7)STL算法之交换赋值
  • (TipsTricks)用客户端模板精简JavaScript代码
  • (ZT)出版业改革:该死的死,该生的生
  • (笔记)M1使用hombrew安装qemu
  • (附源码)计算机毕业设计SSM智慧停车系统
  • (删)Java线程同步实现一:synchronzied和wait()/notify()
  • (算法)Game
  • (转)可以带来幸福的一本书
  • .ai域名是什么后缀?
  • .gitignore文件设置了忽略但不生效
  • .NET Core MongoDB数据仓储和工作单元模式封装
  • .NET Core Web APi类库如何内嵌运行?
  • .NET 应用启用与禁用自动生成绑定重定向 (bindingRedirect),解决不同版本 dll 的依赖问题
  • .NET 中使用 Mutex 进行跨越进程边界的同步
  • .NET6使用MiniExcel根据数据源横向导出头部标题及数据