投射
- 只返回部分字段
- 内嵌文档的投射
- 数组的投射
db.collection.find()的语法结构
db.collection.find(<query>,<projection>)
默认情况下,不指定projection,find就会查询出所有的字段信息,相当于mysql中的select *,此时我们可以投射对查询结果进行指定
,注意,除了文档主键外,不可以混用inclusion和exclusion,也就是不能出现文档主键外的字段在一个projection中声明为0和1.
projection: { field: inclusion }
inclusion: 1 表示返回字段,0表示不返回字段
对字段进行投射
- 查询文档中name为java的balance,包含文档主键
db.accounts.find( { name: "java"},{ balance: 1 } )
- 查询文档中name为java的balance,不包含文档主键
db.accounts.find( { name: "java"},{ balance: 1,_id: 0 } )
- 查询文档中name为java的文档信息,去除文档主键
db.accounts.find( { name: "java"},{ _id: 0 } )
- 错误示范:混用inclusion和exclusion
db.accounts.find( { name: "java"},{ balance: 1,name: 0 } )
对数组字段进行投射
使用$slice操作符可以返回数组字段中的部分元素
- 返回name为java的文档信息中的contact数组中的第一个元素
db.accounts.find( { name: "java" } ,{ _id: 0 , contact: { $slice: 1 } } )
- 返回name为java的文档信息中的contact数组中的最后一个元素
db.accounts.find( { name: "java" } ,{ _id: 0 , contact: { $slice: -1 } } )
- 返回name为java的文档信息中的contact数组中的前2个元素,$slice中参数数组中的第一个参数会做skip操作,第二个参数会做limit操作
db.accounts.find( { name: "java" } ,{ _id: 0 , contact: { $slice: [0,2] } } )
- 返回文档信息中的contact数组包含oracle的name,$elemMatch只返回符合条件的第一个元素
db.accounts.find(
{ name: "java" } ,
{
_id: 0 ,
name: 1 ,
contact: { $elemMatch: { $gt: "alibaba" } }
}
)
- 返回文档信息中的contact数组包含oracle的name和contact中的第一个元素
db.accounts.find(
{ contact: { $gt: "alibaba" } } ,
{
_id: 0 ,
name: 1 ,
"contact.$": 1
}
)
网友评论