👐 编写长管道
聚合管道可能会变得很长,这取决于我们需要运行多少阶段。编写管道就是编写代码,因为你将使用你自己熟悉的编程语言中的 MongoDB 驱动程序(SDK)来编写它。这里我们使用适用于 MongoDB Shell mongosh 的 JavaScript 示例。但如果你在用 Rust 编写一个微服务,你肯定会用 Rust 编写你的管道,其他编程语言同理。
危险
以下语法在 Atlas UI 聚合编辑器中不能使用。UI 编辑器不支持声明变量。
这就是为什么我们应该像这样重写我们最后的管道:
获取 1985 年有 150 页的 15 本书。仅显示 title
、year
、totalInventory
和 available
字段。 (示例文档 这里)
db.books.aggregate([
{$match: {year: 1985, pages: 150}}, {$project: {_id: 0, title: 1, year: 1, totalInventory: 1, available: 1}}, {$limit: 15}
])
将被更改为:
let booksFrom1985With150pages = {$match: {year: 1985, pages: 150}};
let showOnlyTheseFields = {$project: {_id: 0, title: 1, year: 1, totalInventory: 1, available: 1}};
let getJust15books = {$limit: 15};
db.books.aggregate([
booksFrom1985With150pages,
showOnlyTheseFields,
getJust15books,
]);
更改后更容易阅读和理解,对吧?
👐 尝试运行上述管道并比较你的结果:应该与之前相同
提示
您可以像在编程语言中组合函数一样编写你的聚合管道。聚合 是 服务器上运行的代码。在客户端你只是表达 需要 做什么,而不是 如何 进行操作。
提示
由于这是代码,我们甚至可以在管道中添加注释(以 //
开头)
👐 我们还可以使用 $gte
获取 150 页或更多的书。检查 文档 中的 $gte
语法,并编写一个聚合管道以返回 1985 年超过 150 页的 15 本书。仅显示 title
、year
、totalInventory
和 available
字段。 (示例文档 这里)
提示: 我们需要使用 $and
,因为这可能有点复杂。
答案
let moreThan150pages = {pages: {$gte: 150}}
let booksFrom1985WithMoreThan150pages = {$match: {$and: [{year: 1985}, moreThan150pages]}};
let showOnlyTheseFields = {$project: {_id: 0, title: 1, year: 1, totalInventory: 1, available: 1}};
let getJust15books = {$limit: 15};
db.books.aggregate([
booksFrom1985WithMoreThan150pages,
showOnlyTheseFields,
getJust15books,
]);