检索数据
概述
您可以使用查找操作从 MongoDB 数据库中检索数据。您可以通过调用 find()
或 findOne()
方法执行查找操作以匹配一组标准下的文档。find()
或 findOne()
方法。
提示
交互式实验室
本页包含一个简短的交互式实验室,演示如何使用 find()
方法检索数据。您可以直接在浏览器窗口中完成此实验室,无需安装 MongoDB 或代码编辑器。
要开始实验室,请单击页面顶部的打开交互式教程 按钮。要将实验室扩展到全屏格式,请单击实验室面板右上角的全屏按钮(⛶)。
您还可以通过指定可选参数或通过链式其他方法进一步指定查找操作返回的信息,如下面指南所示
您还可以使用聚合操作来检索数据。此类操作允许您对匹配的数据应用有序的转换管道。
如果您要监控数据库以查找符合一组标准的传入数据,您可以使用监视操作在实时通知匹配数据被插入时。
注意
您的查询操作可能会返回一个包含匹配文档的游标引用。有关如何检查存储在游标中的数据的信息,请参阅 游标基础页面。
您可以使用 Node.js 驱动程序连接并执行以下环境中的读取操作托管
MongoDB Atlas:云中 MongoDB 部署的完全托管服务
MongoDB Enterprise:基于订阅的自托管 MongoDB 版本
MongoDB Community:MongoDB的开源版本,免费使用并自行管理
了解更多关于在Atlas UI中执行读取操作的信息对于托管在MongoDB Atlas中的部署,请参阅查看、筛选和排序文档。
查找文档
您可以在一个Collection
对象上调用find()
方法。该方法接受一个查询文档,该文档描述了您要检索的文档。有关如何指定查询文档的更多信息,请参阅指定查询指南。
提示
无查询条件
要执行没有查询条件的查找操作,您可以在find方法参数中传递一个空查询或省略查询文档。
以下操作都返回myColl
集合中的所有文档
myColl.find(); // no query myColl.find({}); // empty query
如果您向findOne()
方法未传递查询或传递空查询,则该操作从集合中返回单个文档。
您可以在传递空查询时指定find操作中的选项。例如,以下代码显示了如何在执行接收空查询参数的find操作时指定投影作为选项
const options = { projection: { _id: 0, field1: 1 }, }; const findResult = await myColl.findOne({}, options);
有关投影文档字段的更多信息,请参阅指定要返回的字段指南。
find()
方法返回一个Cursor
实例,您可以通过该实例访问匹配的文档。findOne()
方法返回一个Promise
实例,您可以通过解析它来访问匹配的文档或在没有匹配的情况下返回一个null
值。
示例
一家披萨店想要找到昨天由Lemony Snicket订购的所有披萨。他们在orders
集合上运行以下find()
查询
// Search for orders by name and within a specific date range const findResult = orders.find({ name: "Lemony Snicket", date: { $gte: new Date(new Date().setHours(00, 00, 00)), $lt: new Date(new Date().setHours(23, 59, 59)), }, });
操作返回后,findResult
变量引用一个Cursor
。您可以使用如下所示的for await...of
语法打印检索到的文档
for await (const doc of findResult) { console.log(doc); }
输出可能类似于以下内容
[ { name: "Lemony Snicket", type: "horseradish pizza", qty: 1, status: "delivered", date: ... }, { name: "Lemony Snicket", type: "coal-fired oven pizza", qty: 3, status: "canceled", date: ...}, ... ]
附加信息
有关演示查找操作的可运行代码示例,请参阅以下使用示例
有关 findOne()
和 find()
方法的更多信息,请参阅以下服务器手册文档
从文档中聚合数据
如果您想运行自定义处理管道从数据库中检索数据,可以使用 aggregate()
方法。此方法接受要按顺序运行的聚合表达式。这些表达式允许您从集合中过滤、分组和排列结果数据。
示例
一家披萨餐厅想要运行一个按需状态报告,以总结过去一周的披萨订单。他们在 orders
集合上运行以下 aggregate()
查询,以获取每个不同 "status" 字段的总额
// Group orders by status within the last week const aggregateResult = orders.aggregate([ { $match: { date: { $gte: new Date(new Date().getTime() - 1000 * 3600 * 24 * 7), $lt: new Date(), }, }, }, { $group: { _id: "$status", count: { $sum: 1, }, }, }, ]);
一旦操作返回,aggregateResult
变量引用一个 Cursor
。您可以使用以下 for await...of
语法打印检索到的文档,如下所示
for await (const doc of aggregateResult) { console.log(doc); }
输出可能类似于以下内容
[ { _id: 'delivering', count: 5 }, { _id: 'delivered', count: 37 }, { _id: 'created', count: 9 } ]
附加信息
监控数据更改
您可以使用watch()
方法监控集合以匹配某些条件的数据更改。这些更改包括插入、更新、替换和删除文档。您可以将聚合命令的管道传递给此方法,该管道在集合上执行写操作时,按顺序对更改的数据运行。
示例
一家披萨餐厅希望在收到新的披萨订单时收到通知。为了实现这一点,他们创建了一个聚合管道来过滤插入操作并返回特定字段。他们将此管道传递给在orders
集合上调用的watch()
方法,如下所示
// Set up a change stream to listen for new order insertions const changeStream = orders.watch([ { $match: { operationType: "insert" } }, { $project: { "fullDocument.name": 1, "fullDocument.address": 1, }, }, ]); changeStream.on("change", change => { const { name, address } = change.fullDocument; console.log(`New order for ${name} at ${address}.`); });
更多信息
有关watch()
方法的可运行示例,请参阅监控更改使用示例。