过滤的子集
简介
在本教程中,您可以学习如何使用 Node.js 驱动程序构建聚合管道、对集合执行聚合,以及通过完成和运行示例应用程序来打印结果。此聚合执行以下操作:
根据字段值匹配文档子集
格式结果文档
提示
您还可以使用 Query API查询集合中的文档子集。 要学习;了解如何指定查询,请参阅读取操作指南。
聚合任务摘要
本教程演示如何查询集合中特定文档子集的集合。结果包含描述三位最年轻工程师的文档。
此示例使用一个collection persons
,其中包含描述人员的文档。每个文档都包含一个人的姓名、出生日期、职业和其他详细信息。
开始之前
在开始本教程之前,请完成聚合模板应用说明,设立有效的 Node.js应用程序。
设置应用后,通过将以下代码添加到应用程序中来访问 persons
集合:
const personColl = aggDB.collection("persons");
删除集合中的所有现有数据,并将示例数据插入到 persons
集合中,如以下代码所示:
await personColl.deleteMany({}); const personData = [ { person_id: "6392529400", firstname: "Elise", lastname: "Smith", dateofbirth: new Date("1972-01-13T09:32:07Z"), vocation: "ENGINEER", address: { number: 5625, street: "Tipa Circle", city: "Wojzinmoj", }, }, { person_id: "1723338115", firstname: "Olive", lastname: "Ranieri", dateofbirth: new Date("1985-05-12T23:14:30Z"), gender: "FEMALE", vocation: "ENGINEER", address: { number: 9303, street: "Mele Circle", city: "Tobihbo", }, }, { person_id: "8732762874", firstname: "Toni", lastname: "Jones", dateofbirth: new Date("1991-11-23T16:53:56Z"), vocation: "POLITICIAN", address: { number: 1, street: "High Street", city: "Upper Abbeywoodington", }, }, { person_id: "7363629563", firstname: "Bert", lastname: "Gooding", dateofbirth: new Date("1941-04-07T22:11:52Z"), vocation: "FLORIST", address: { number: 13, street: "Upper Bold Road", city: "Redringtonville", }, }, { person_id: "1029648329", firstname: "Sophie", lastname: "Celements", dateofbirth: new Date("1959-07-06T17:35:45Z"), vocation: "ENGINEER", address: { number: 5, street: "Innings Close", city: "Basilbridge", }, }, { person_id: "7363626383", firstname: "Carl", lastname: "Simmons", dateofbirth: new Date("1998-12-26T13:13:55Z"), vocation: "ENGINEER", address: { number: 187, street: "Hillside Road", city: "Kenningford", }, }, ]; await personColl.insertMany(personData);
Tutorial
1
为工程人员增加一个匹配阶段
首先,添加一个 $match阶段,用于查找vocation
字段的值为"ENGINEER"
的文档:
pipeline.push({ $match: { "vocation": "ENGINEER" }, });
2
添加排序阶段以从最年轻到最年长进行排序
接下来,添加一个$sort阶段,根据dateofbirth
字段按降序对文档进行排序,从而首先列出最年轻的人:
pipeline.push({ $sort: { "dateofbirth": -1, } });
3
添加限制阶段以仅查看三个结果
接下来,在管道中添加一个$limit阶段,以仅输出结果中的前三个文档。
pipeline.push({ $limit: 3 });
4
添加未设置阶段以删除不需要的字段
最后,添加一个$unset阶段。 $unset
阶段会从结果文档中删除不必要的字段:
pipeline.push({ $unset: [ "_id", "address", ] });
提示
如果将具有不同字段的文档添加到集合中,请使用 $unset
操作符而不是 $project
来避免修改聚合管道。
5
6
解释结果
聚合结果包含三个文档。这些文档代表了职业为"ENGINEER"
的三个最年轻的人,按从幼到长的顺序排列。结果省略了 _id
和 address
字段。
{ person_id: '7363626383', firstname: 'Carl', lastname: 'Simmons', dateofbirth: 1998-12-26T13:13:55.000Z, vocation: 'ENGINEER' } { person_id: '1723338115', firstname: 'Olive', lastname: 'Ranieri', dateofbirth: 1985-05-12T23:14:30.000Z, gender: 'FEMALE', vocation: 'ENGINEER' } { person_id: '6392529400', firstname: 'Elise', lastname: 'Smith', dateofbirth: 1972-01-13T09:32:07.000Z, vocation: 'ENGINEER' }
要查看本教程的完整代码,请参阅Github上的 Completed Filtered Subset App Github。