首页 > 数据库 >MongoDB CRUD操作:投影Project详解

MongoDB CRUD操作:投影Project详解

时间:2024-05-28 23:29:59浏览次数:19  
标签:status MongoDB CRUD Project item 字段 文档 投影 size

MongoDB CRUD操作:投影Project详解

文章目录

默认情况下,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
   }
]

标签:status,MongoDB,CRUD,Project,item,字段,文档,投影,size
From: https://blog.csdn.net/superatom01/article/details/139280614

相关文章

  • MongoDb简介
    MongoDb入门MongoDB不是关系数据库,而是面向文档(document-oriented)的数据库。MongoDB的设计采用了横向扩展。面向文档的数据模型使跨多台服务器拆分数据更加容易。MongoDB会自动平衡跨集群的数据和负载,自动重新分配文档,并将读写操作路由到正确的机器上文档文档是MongoDB......
  • Docker安装MongoDB
    拉取mongo镜像dockerpullmongo:4.4创建mongo数据持久化目录mkdir-p/docker_volume/mongodb/data运行容器dockerrun-itd--namemongo-v/docker_volume/mongodb/data:/data/db-p27017:27017mongo:4.4--auth.创建用户登录mongo容器,并进入到【admin】数据库dockerexec-......
  • Docker 快速搭建 MongoDB 4.x 集群(一主一从)
    目录1.生成mongo-file2.启动主节点3.启动从节点4.配置副本集5.注意事项环境:MongoDB4.0.25,AlmaLinux(建议使用Linux)部署的时候是在同一个及其上操作的,实际可以放在不同机器上。截止到2024年05月,MongoDB已经到7.x版本,后续再补一个7.x较新版本的安装......
  • VS2022查看项目宏定义(SolutionDir/Configuration/ProjectName等)
    参考:https://blog.csdn.net/aoxuestudy/article/details/122197793右击打开C++项目属性点击【编辑】:点击【宏】:进一步搜索定位:......
  • EBU4201 Introductory Java Programming 2023/24Mini Project(⼉童练习乘法表 下个文
    Task1[25marks]SuperHeroTTisasimpleGraphicalUserInterface(GUI)applicationforchildrenwheretheycanpractisetheirtimestables(seeFigure1).Whenlaunched,yourappshouldlooklikeFigure1-FirstlaunchofSuperHeroTT.Thedrop-downbo......
  • mongodb查询平级数据,返回树形结构
    #mongodb查询数据,只返回一级、二级树形结构,子级数据对象整个返回db.t_ythgk_zd.aggregate([//1.匹配指定的dmlx{$match:{sjdm:"YTHGK_DIC_00002",yxx:1}},//2.查找上级代码(sjdm)对应的文档,并构建一个子文档数组{$lookup:{from:"t......
  • db.collection.find(query, projection)
    Selectsdocumentsinacollectionandreturnsa cursor totheselecteddocuments.ParameterTypeDescriptionquerydocumentOptional.Specifiesselectionfilterusing queryoperators.Toreturnalldocumentsinacollection,omitthisparameterorpass......
  • 【MySQL】初识数据库-CRUD
    ❣博主主页:33的博客❣▶️文章专栏分类:MySQL◀️......
  • 在Ubuntu中部署MongoDB数据库
    提示:为了方便,接下来的操作都在shell中进行(需提前建立ssh连接),当然也可以在虚拟机中进行。1.导入MongoDB的公钥首先导入MongoDB的公钥,以便后续下载和安装MongoDB输入如下代码wget-qO-https://www.mongodb.org/static/pgp/server-6.0.asc|sudoapt-keyadd-2.创建M......
  • 【Python快速上手(三十一)】- Python MongoDB 详解
    目录Python快速上手(三十一)PythonMongoDB详解1.安装pymongo2.连接MongoDB3.创建和删除集合4.CRUD操作5.查询操作6.索引7.聚合8.其他操作9.连接池和超时10.实际应用案例Python快速上手(三十一)PythonMongoDB详解MongoDB是一种NoSQL数据库,它使用文......