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
,可以显式包含多个字段,下面的操作返回item
、status
以及默认的_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
字段外,不能在投影文档中同时指定输出和排除的字段。
指定排除的字段
可以使用投影来排除特定字段,而不是列出要在匹配文档中返回的字段,下面的示例返回匹配文档中除status
和 instock
字段之外的所有字段,也就是排除这两个字段:
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
字段的值,并投影新字段area
和reportNumber
。
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