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

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

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

相关文章

拉取代码报错: SSL certificate problem: self signed certificate

问题描述&#xff1a; 使用SmartGit工具clone项目时&#xff0c;弹出框提示信息为“XXXX&#xff0c;SSL certificate problem: self signed certificate” 问题分析&#xff1a; 提示信息为SSL认证失败&#xff0c;可以关闭SSL的认证 解决方案&#xff1a; 在windows的命…

【Git】Git命令

原文链接&#xff1a;https://github.com/Wscats/CV/issues/31 新建 创建一个新的 git 版本库。这个版本库的配置、存储等信息会被保存到.git 文件夹中 # 初始化当前项目 $ git init# 新建一个目录&#xff0c;将其初始化为Git代码库 $ git init [project-name]# 在指定目录创…

go mod包管理与应用,常见错误排查方法

go mod包管理 go 中 包管理使用go mod 进行包管理 go mod init 项目名称 go mod init myproject_go生成的go.mod中有 module myproject_go 创建目录go_service 其下有两个go文件&#xff0c;go_request.go go_write.go . 根目录下有main.go入口文件。于是项目结构类似于&…

10.时间片调度

一、简介 时间片调度主要针对优先级相同的任务&#xff0c;当多个任务的优先级相同时&#xff0c;任务调度器会在每 一次系统时钟节拍到的时候切换任务&#xff0c;也就是说 CPU 轮流运行优先级相同的任务&#xff0c;每个任务运 行的时间就是一个系统时钟节拍。 二、相关实…

Percona Toolkit 神器全攻略(实用类)

Percona Toolkit 神器全攻略&#xff08;实用类&#xff09; Percona Toolkit 神器全攻略系列共八篇&#xff0c;前文回顾&#xff1a; 前文回顾Percona Toolkit 神器全攻略 全文约定&#xff1a;$为命令提示符、greatsql>为GreatSQL数据库提示符。在后续阅读中&#xff0c;…

Linux完整版命令大全(十四)

od(octal dump) 功能说明&#xff1a;输出文件内容。语  法&#xff1a;od [-abcdfhilovx][-A <字码基数>][-j <字符数目>][-N <字符数目>][-s <字符串字符数>][-t <输出格式>][-w <每列字符数>][--help][--version][文件...]补充说明&…

【吊打面试官系列】Java高并发篇 - 怎么唤醒一个阻塞的线程?

大家好&#xff0c;我是锋哥。今天分享关于 【怎么唤醒一个阻塞的线程&#xff1f;】面试题&#xff0c;希望对大家有帮助&#xff1b; 怎么唤醒一个阻塞的线程&#xff1f; 如果线程是因为调用了 wait()、sleep()或者 join()方法而导致的阻塞&#xff0c;可以中断线程&#xf…

2024年618网购节各大电商超级红包二维码集合

一年一度的电商618网购节又要来了&#xff0c;下面收集了淘宝/京东/拼多多的618红包二维码&#xff0c;手机扫描或识别即可每天领红包&#xff0c;可参考好物分享中的商品下单&#xff1a; 淘宝618超级红包&#xff1a;即日起至2024.6.10&#xff0c;每天可领一次 京东618无门…

【强化学习05】从Q学习到深度Q学习

深度Q学习&#xff08;Deep Q-Learning, DQN&#xff09;是将深度学习与Q学习结合起来的一种强化学习方法&#xff0c;利用神经网络来近似Q值函数&#xff0c;解决传统Q学习在大规模或连续状态空间中的局限性。下面详细解释DQN的机理。 背景知识 Q学习 Q学习是一种值函数法&…

数据分析 - 合并查询

在数据分析中&#xff0c;合并查询&#xff08;Merge Query&#xff09;是一个重要的操作&#xff0c;它允许用户将两个或多个数据集&#xff08;通常是表格&#xff09;基于某些共同属性&#xff08;如ID&#xff09;进行合并&#xff0c;从而获取更丰富的数据视图。以下是关于…

vue+springboot实现echarts数据图统计

①vue项目修改配置 安装依赖&#xff1a; npm i echarts -S 修改路由index.js&#xff1a; import Vue from vue import VueRouter from vue-router import Manager from ../views/Manager.vue // 解决导航栏或者底部导航tabBar中的vue-router在3.0版本以上频繁点击菜单报错…

STL详解(五)——list的使用

文章目录 list的介绍list的使用list的定义方式list的插入和删除push_front和pop_frontpush_back和pop_backinserterase list的迭代器使用begin和endrbegin和rend list的元素获取front和back list的大小控制sizeresizeemptyclear list的操作函数sortspliceremoveremove_ifunique…

「光储充放」一体充电站-一文读懂光储充放充电站

“光储充放”一体充电站作为一种储能充电的新形式渐渐走进人们的生活&#xff0c;全国很多地区都开始陆续投放运营“光储充放”一体充电站&#xff0c;今天的这篇文章&#xff0c;就带大家全面了解“光储充放”这一新型充电站。 头图来源 | 视觉中国 01 政策背景 早在2020年…

集合的交集、并集和差集运算

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 集合最常用的操作就是进行交集、并集、差集和对称差集运算。进行交集运算时使用“&”符号&#xff0c;进行并集运算时使用“&#xff5c;”符号&…

详解 Scala 的函数式编程

一、函数基础 函数式是基于数学理论的函数概念&#xff0c;类似于 y f(x) 1. 函数定义 1.1 语法 /* 函数结构&#xff1a;def funcName(param1 : type1, param2 : type2,...): type { statement }*/ def sum(x : Int, y : Int): Int {return x y }1.2 案例 object Test…

基于振弦采集仪的岩土工程振弦监测技术研究与应用

基于振弦采集仪的岩土工程振弦监测技术研究与应用 岩土工程振弦监测技术是一种基于振弦采集仪的测试方法&#xff0c;用于对岩土体的力学特性进行监测和分析。振弦采集仪是一种先进的测试设备&#xff0c;能够准确测量岩土体中的振动响应&#xff0c;并通过分析振动信号来获取…

mysql中的内连接与外连接

在MySQL中&#xff0c;内连接和外连接是用于从多个表中检索数据的两种不同的连接方式。 内连接&#xff08;INNER JOIN&#xff09;&#xff1a; 内连接返回两个表之间匹配的行。它只返回两个表中共同匹配的行&#xff0c;如果在一个表中没有匹配到对应的行&#xff0c;则不会显…

学习笔记——数据通信基础——数据通信网络(拓扑结构)

网络拓扑 网络拓扑(Network Topology)是指用传输介质(例如双绞线、光纤等)互连各种设备(例如计算机终端、路由器、交换机等)所呈现的结构化布局。 1、网络拓扑形态 星型网络∶所有节点通过一个中心节点连接在一起。 优点∶容易在网络中增加新的节点。通信数据必须经过中心节点…

python-数据可视化(总)

python-数据可视化 ** 数据可视化 指的是通过可视化表示来探索数据&#xff0c;它与数据挖掘**紧密相关&#xff0c;而数据挖掘指的是使用代码来探索数据集的规律和关联。数据集可以是用一行代码就能表示的小型数字列表&#xff0c;也可以是数以吉字节的数据 最流行的工具之一…

yolox代码详解(从tools/train.py开始扩展,更新中)

一、训练部分相关代码详解 tools/train.py #!/usr/bin/env python3 # -*- coding:utf-8 -*- # Copyright (c) Megvii, Inc. and its affiliates.import argparse import random import warnings from loguru import loggerimport torch import torch.backends.cudnn as cudnn…