默认情况下,MongoDB查询会返回匹配文档中的所有字段。为了限制MongoDB发送给应用大量的无关数据,你可以通过db.collection.find(query,projection)
方法来指定或限制要返回的字段。
在没设置projection
参数时,查询会返回查询到的文档中的所有字段。例如test
集合中添加下面的文档,有5个字段:_id
、item
、status
、size
和instock
字段,其中instock
字段为数组。
db.test.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.test.find({item:"postcard"})
命令,会得到如下图所示的结果:
也叫做包含模式,它指定返回的键,而不返回其他的键。具体是将projection
中返回的字段指定为1
,就可以实现返回指定的字段。例如db.test.find({item:"postcard"},{status:1})
,会返回两个字段:_id
,status
。其中_id
字段是默认返回。
如果不想返回_id
字段,只需要将projection
中的_id
字段值设置为0
。例如:db.test.find({item:"postcard"},{status:1,_id:0})
也叫排除模式,它指定不返回的键,而返回其他键。具体是将projection
中字段值设置为0
即可,例如,查询结果文档中的status
字段不显示,则使用命令:db.test.find({item:"postcard"},{status:0})
注意: 上面两种模式不能混用,因为这样的话,MongoDB就无法推断其他键是否应该返回。即projection
中的字段值,要么全是1
,要么全是0
。但是_id
字段是个特例,在包含模式下,_id
字段可以为0
。
使用$slice
字段来定义,例如返回postcard
匹配文档中的除了status
的其他字段,并且instock
字段只返回正序排列为1
的内容。命令如下:db.test.find({item:"postcard"},{status:0,instock:{$slice:1}})
参考文章: