Skip to main content

👐 编写长管道

聚合管道可能会变得很长,这取决于我们需要运行多少阶段。编写管道就是编写代码,因为你将使用你自己熟悉的编程语言中的 MongoDB 驱动程序(SDK)来编写它。这里我们使用适用于 MongoDB Shell mongosh 的 JavaScript 示例。但如果你在用 Rust 编写一个微服务,你肯定会用 Rust 编写你的管道,其他编程语言同理。

danger

以下语法在 Atlas UI 聚合编辑器中不能使用。UI 编辑器不支持声明变量。

这就是为什么我们应该像这样重写我们最后的管道:

获取 1985 年有 150 页的 15 本书。仅显示 titleyeartotalInventoryavailable 字段。 (示例文档 这里)

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,
]);

更改后更容易阅读和理解,对吧?

👐 尝试运行上述管道并比较你的结果:应该与之前相同

tip

您可以像在编程语言中组合函数一样编写你的聚合管道。聚合 服务器上运行的代码。在客户端你只是表达 需要 做什么,而不是 如何 进行操作。

tip

由于这是代码,我们甚至可以在管道中添加注释(以 // 开头)

👐 我们还可以使用 $gte 获取 150 页或更多的书。检查 文档 中的 $gte 语法,并编写一个聚合管道以返回 1985 年超过 150 页的 15 本书。仅显示 titleyeartotalInventoryavailable 字段。 (示例文档 这里)

提示: 我们需要使用 $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,
]);