您的位置:首页 > 数据库 > Mongodb

MongoDB文档翻译-CRUD操作-从查询中返回投影字段

2017-02-27 08:11 721 查看
英文原文地址:https://docs.mongodb.com/v3.2/tutorial/project-fields-from-query-results/

本文章属个人翻译,作个人学习之用,如有雷同,纯属巧合。如有错误之处,欢迎指正。

从查询中返回投影字段

MongoDB默认返回匹配文档的所有字段。为了限制Mongo返回给应用的数据量,可以在查询操作中包含一个
投影
文档。

投影文档

投影文档限制匹配文档返回的字段。投影文档可以指定包含的字段或者排除的字段,格式如下:

{ field1: <value>, field2: <value> ... }


<value>
可如下取值:

1 或 true,表示在返回的文档中包含该字段

0 或 false,表示在返回的文档中不包含该字段

用投影操作符的表达式

注意:

对于_id字段,返回_id字段时没必要显式指定_id: 1。
db.collection.find()
方法总数返回_id字段,除非你指定_id: 0。

一个投影不能同时有包含和排除两种方式,_id字段的排除除外。在显式包含字段的投影中,_id字段时唯一可以显式排除的字段。

示例集合

本文的例子在
mongo
shell中使用
db.collection.find()
方法。在
mongo
shell中,如果返回的游标没有用var关键字赋值给变量,则游标自动迭代至20次,打印结果的前20个文档。

为填充本例子中所提到的
users
集合,请在
mongo
shell中运行一下代码:

注意

如果
users
集合已经包含了相同_id的集合,插入文档前需要删除该集合(
db.users.drop()


db.users.insertMany(
[
{
_id: 1,
name: "sue",
age: 19,
type: 1,
status: "P",
favorites: { artist: "Picasso", food: "pizza" },
finished: [ 17, 3 ],
badges: [ "blue", "black"
4000
],
points: [
{ points: 85, bonus: 20 },
{ points: 85, bonus: 10 }
]
},
{
_id: 2,
name: "bob",
age: 42,
type: 1,
status: "A",
favorites: { artist: "Miro", food: "meringue" },
finished: [ 11, 25 ],
badges: [ "green" ],
points: [
{ points: 85, bonus: 20 },
{ points: 64, bonus: 12 }
]
},
{
_id: 3,
name: "ahn",
age: 22,
type: 2,
status: "A",
favorites: { artist: "Cassatt", food: "cake" },
finished: [ 6 ],
badges: [ "blue", "red" ],
points: [
{ points: 81, bonus: 8 },
{ points: 55, bonus: 20 }
]
},
{
_id: 4,
name: "xi",
age: 34,
type: 2,
status: "D",
favorites: { artist: "Chagall", food: "chocolate" },
finished: [ 5, 11 ],
badges: [ "red", "black" ],
points: [
{ points: 53, bonus: 15 },
{ points: 51, bonus: 15 }
]
},
{
_id: 5,
name: "xyz",
age: 23,
type: 2,
status: "D",
favorites: { artist: "Noguchi", food: "nougat" },
finished: [ 14, 6 ],
badges: [ "orange" ],
points: [
{ points: 71, bonus: 20 }
]
},
{
_id: 6,
name: "abc",
age: 43,
type: 1,
status: "A",
favorites: { food: "pizza", artist: "Picasso" },
finished: [ 18, 12 ],
badges: [ "black", "blue" ],
points: [
{ points: 78, bonus: 8 },
{ points: 57, bonus: 7 }
]
}
]
)


返回匹配文档的所有字段

如果你不指定投影,
db.collection.find()
方法返回匹配查询的文档的所有字段。

以下例子从
users
集合中返回status等于”A”的所有文档:

db.users.find( { status: "A" } )


匹配的文档包含所有字段:

{
"_id" : 2,
"name" : "bob",
"age" : 42,
"type" : 1,
"status" : "A",
"favorites" : { "artist" : "Miro", "food" : "meringue" },
"finished" : [ 11, 25 ],
"badges" : [ "green" ],
"points" : [ { "points" : 85, "bonus" : 20 }, { "points" : 64, "bonus" : 12 } ]
}
{
"_id" : 3,
"name" : "ahn",
"age" : 22,
"type" : 2,
"status" : "A",
"favorites" : { "artist" : "Cassatt", "food" : "cake" },
"finished" : [ 6 ],
"badges" : [ "blue", "red" ],
"points" : [ { "points" : 81, "bonus" : 8 }, { "points" : 55, "bonus" : 20 } ]
}
{
"_id" : 6,
"name" : "abc",
"age" : 43,
"type" : 1,
"status" : "A",
"favorites" : { "food" : "pizza", "artist" : "Picasso" },
"finished" : [ 18, 12 ],
"badges" : [ "black", "blue" ],
"points" : [ { "points" : 78, "bonus" : 8 }, { "points" : 57, "bonus" : 7 } ]
}


只返回指定的字段和_id字段

一个投影可以显式地包含几个字段。在以下操作中,
db.collection.find()
方法返回匹配查询的所有文档。在结果集中,只有name、status和_id字段有返回。

db.users.find( { status: "A" }, { name: 1, status: 1 } )


该操作返回以下文档:

{ "_id" : 2, "name" : "bob", "status" : "A" }
{ "_id" : 3, "name" : "ahn", "status" : "A" }
{ "_id" : 6, "name" : "abc", "status" : "A" }


只返回指定的字段

你可以在投影中指定排除_id来从结果中移除_id字段。如下:

db.users.find( { status: "A" }, { name: 1, status: 1, _id: 0 } )


在结果集中,只有name和status字段返回。

{ "name" : "bob", "status" : "A" }
{ "name" : "ahn", "status" : "A" }
{ "name" : "abc", "status" : "A" }


返回除了排除字段之外的所有字段

要排除一个或多个字段,你可以用投影来排除特定的字段,而不是在匹配文档中列出包含的字段:

db.users.find( { status: "A" }, { favorites: 0, points: 0 } )


在结果集中,favorites和points字段不从匹配文档中返回:

{
"_id" : 2,
"name" : "bob",
"age" : 42,
"type" : 1,
"status" : "A",
"finished" : [ 11, 25 ],
"badges" : [ "green" ]
}
{
"_id" : 3,
"name" : "ahn",
"age" : 22,
"type" : 2,
"status" : "A",
"finished" : [ 6 ],
"badges" : [ "blue", "red" ]
}
{
"_id" : 6,
"name" : "abc",
"age" : 43,
"type" : 1,
"status" : "A",
"finished" : [ 18, 12 ],
"badges" : [ "black", "blue" ]
}


不能在投影文档中同时包括包含和排除语句,_id字段是个例外。

返回嵌入文档中的指定字段

点标记法
返回嵌入文档中的指定字段

以下例子指定投影返回:_id字段、name字段、status字段和favorites文档中的food字段,food字段仍然包含在favorites文档内部:

db.users.find(
{ status: "A" },
{ name: 1, status: 1, "favorites.food": 1 }
)


该操作返回以下文档:

{ "_id" : 2, "name" : "bob", "status" : "A", "favorites" : { "food" : "meringue" } }
{ "_id" : 3, "name" : "ahn", "status" : "A", "favorites" : { "food" : "cake" } }
{ "_id" : 6, "name" : "abc", "status" : "A", "favorites" : { "food" : "pizza" } }


不返回嵌入文档的指定字段

点标记法
来抑制嵌入文档中的指定字段,用0,而不是1。

以下例子指定投影不包含favorites文档中的food字段,其他字段都会返回:

db.users.find(
{ status: "A" },
{ "favorites.food": 0 }
)


c322
该操作返回以下文档:

{
"_id" : 2,
"name" : "bob",
"age" : 42,
"type" : 1,
"status" : "A",
"favorites" : { "artist" : "Miro" },
"finished" : [ 11, 25 ],
"badges" : [ "green" ],
"points" : [ { "points" : 85, "bonus" : 20 }, { "points" : 64, "bonus" : 12 } ]
}
{
"_id" : 3,
"name" : "ahn",
"age" : 22,
"type" : 2,
"status" : "A",
"favorites" : { "artist" : "Cassatt" },
"finished" : [ 6 ],
"badges" : [ "blue", "red" ],
"points" : [ { "points" : 81, "bonus" : 8 }, { "points" : 55, "bonus" : 20 } ]
}
{
"_id" : 6,
"name" : "abc",
"age" : 43,
"type" : 1,
"status" : "A",
"favorites" : { "artist" : "Picasso" },
"finished" : [ 18, 12 ],
"badges" : [ "black", "blue" ],
"points" : [ { "points" : 78, "bonus" : 8 }, { "points" : 57, "bonus" : 7 } ]
}


数组中嵌入文档的投影

点标记法
来投影数组中嵌入文档的指定字段。

以下例子指定投影返回name字段、status字段和points数组中文档的bonus字段。_id字段默认是返回的。

db.users.find( { status: "A" }, { name: 1, status: 1, "points.bonus": 1 } )


该操作返回以下文档:

{ "_id" : 2, "name" : "bob", "status" : "A", "points" : [ { "bonus" : 20 }, { "bonus" : 12 } ] }
{ "_id" : 3, "name" : "ahn", "status" : "A", "points" : [ { "bonus" : 8 }, { "bonus" : 20 } ] }
{ "_id" : 6, "name" : "abc", "status" : "A", "points" : [ { "bonus" : 8 }, { "bonus" : 7 } ] }


从数组中投影指定的数组元素

对于包含数组的字段,MongoDB提供了下列投影操作符:
$elemMatch
$slice
$


以下例子用
$slice
投影操作符返回points数组的最后一个元素。

db.users.find( { status: "A" }, { name: 1, status: 1, points: { $slice: -1 } } )


该操作返回以下文档:

{ "_id" : 2, "name" : "bob", "status" : "A", "points" : [ { "points" : 64, "bonus" : 12 } ] }
{ "_id" : 3, "name" : "ahn", "status" : "A", "points" : [ { "points" : 55, "bonus" : 20 } ] }
{ "_id" : 6, "name" : "abc", "status" : "A", "points" : [ { "points" : 57, "bonus" : 7 } ] }


$elemMatch
$slice
$
是唯一可以用来从数组元素中投影指定包含某个元素的方法。例如,你不能用数组下标 {“ratings.0”: 1} 来投影数组元素,该投影不会投影到数组的第一个元素上。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: