对于 AI 代理:可在 https://www.mongodb.com/zh-cn/docs/llms.txt 获取文档索引—通过在任何 URL 路径后添加 .md 可获取所有页面的 Markdown 版本。

查找文档

可以执行查找操作,从 MongoDB 数据库检索数据。您可以通过调用 find() 或 findOne() 方法来执行查找操作,以根据一组条件匹配文档。

提示

互动实验室

本页包括一个简短的交互式实验,演示如何使用 find() 方法检索数据。您无需安装 MongoDB 或代码编辑器,即可直接在浏览器窗口中完成此实验。

要启动实验室,请单击页面顶部的 Open Interactive Tutorial 按钮。要将实验室扩展为全屏格式,请单击实验室窗格右上角的全屏按钮 (⛶)。

您还可以通过指定可选参数或链接其他方法,进一步指定查找操作返回的信息,如以下指南所示:

还可以使用聚合操作来检索数据。这种操作类型让您可以对匹配的数据应用一套有序的转换管道。

如果要监测有无符合特定条件的数据传入数据库,则可以使用监控(watch)操作。这样,当有匹配的数据插入时,您可实时收到通知。

注意

您的查询操作可能会返回对包含匹配文档的游标的引用。要学习;了解如何检查游标中存储的数据,请参阅从游标访问数据页面。

您可以使用 Node.js 驱动程序进行连接并对以下环境中托管的部署执行读取操作:

如需了解有关在 Atlas 用户界面中对 MongoDB Atlas 托管的部署执行读取操作的更多信息,请参阅查看、过滤和排序文档。

您可对 Collection 对象调用 find() 方法。此方法接受用于描述待检索文档的查询文档。有关如何指定查询文档的更多信息,请参阅指定查询指南。

提示

无查询条件

要执行没有查询条件的查找操作,您可以在查找方法参数中传递空查询或省略查询文档。

以下操作均返回 myColl 集合中的所有文档:

myColl.find(); // no querymyColl.find({}); // empty query

如果不传递查询或向 findOne() 方法传递空查询,则该操作将从集合中返回单个文档。

即使传递空查询,也可以将游标方法链接到查找操作。示例,以下代码显示了如何在执行接收空查询参数的查找操作时指定投影:

const projectFields = { _id: 0, field1: 1 }; const findResult = await myColl.findOne().project(projectFields);

有关投影文档字段的更多信息,请参阅指定要返回的字段指南。

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: ...}, ...]

注意

设置示例

该示例使用连接 URI 连接到 MongoDB 实例。如需了解有关连接到 MongoDB 实例的更多信息,请参阅连接到 MongoDB 指南。本示例还使用了Atlas 示例数据集中包含的 sample_mflix 数据库中的 movies 集合。您可以按照 MongoDB 入门指南,将它们加载到 MongoDB Atlas 的免费集群数据库中。

以下完整文件示例从 movies集合中查找单个文档。它使用以下参数:

  • 用于匹配 title 值为 'The Room' 的文档的筛选器。

  • 排序,按评分按降序组织匹配的文档,因此,如果我们的查询匹配多个文档,返回的文档将是评分最高的文档。

  • 从返回的文档中显式排除 _id字段并显式仅包含 title 和 imdb对象(及其嵌入式字段)的投影。

import { MongoClient } from "mongodb"; // Replace the uri string with your MongoDB deployment's connection string.const uri = "<connection string uri>"; const client = new MongoClient(uri); async function run() { try { // Get the database and collection on which to run the operation const database = client.db("sample_mflix"); const movies = database.collection("movies"); // Query for a movie that has the title 'The Room' const query = { title: "The Room" }; const options = { // Sort matched documents in descending order by rating sort: { "imdb.rating": -1 }, // Include only the `title` and `imdb` fields in the returned document projection: { _id: 0, title: 1, imdb: 1 }, }; // Execute query const movie = await movies.findOne(query, options); // Print the document returned by findOne() console.log(movie); } finally { await client.close(); }}run().catch(console.dir);

运行上述示例将产生以下输出:

{ title: 'The Room', imdb: { rating: 3.5, votes: 25673, id: 368226 } }

注意

设置示例

该示例使用连接 URI 连接到 MongoDB 实例。如需了解有关连接到 MongoDB 实例的更多信息,请参阅连接到 MongoDB 指南。本示例还使用了Atlas 示例数据集中包含的 sample_mflix 数据库中的 movies 集合。您可以按照 MongoDB 入门指南,将它们加载到 MongoDB Atlas 的免费集群数据库中。

以下完整文件示例从 movies集合中查找文档。它使用以下参数:

  • 用于匹配 runtime 值小于 15 分钟的文档的筛选器。

  • 排序,按标题升序组织返回的文档(按字母顺序,“A”在“Z”之前,“1”在“9”之前)。

  • 从返回的文档中显式排除 _id字段并显式仅包含 title 和 imdb对象(及其嵌入式字段)的投影。

import { MongoClient } from "mongodb"; // Replace the uri string with your MongoDB deployment's connection string.const uri = "<connection string uri>"; const client = new MongoClient(uri); async function run() { try { // Get the database and collection on which to run the operation const database = client.db("sample_mflix"); const movies = database.collection("movies"); // Query for movies that have a runtime less than 15 minutes const query = { runtime: { $lt: 15 } }; const sortFields = { title: 1 }; const projectFields = { _id: 0, title: 1, imdb: 1 }; // Execute query const cursor = movies.find(query).sort(sortFields).project(projectFields); // Print a message if no documents were found if ((await movies.countDocuments(query)) === 0) { console.log("No documents found!"); } // Print returned documents for await (const doc of cursor) { console.dir(doc); } } finally { await client.close(); }}run().catch(console.dir);

运行上述示例将产生以下输出:

{ title: '10 Minutes', imdb: { rating: 7.9, votes: 743, id: 339976 } }{ title: '3x3', imdb: { rating: 6.9, votes: 206, id: 1654725 } }{ title: '7:35 in the Morning', imdb: { rating: 7.3, votes: 1555, id: 406501 } }{ title: '8', imdb: { rating: 7.8, votes: 883, id: 1592502 } }...

注意

在迭代游标之前,必须将游标方法(如 sort()、limit()、skip() 或 project())链接到读操作。如果在迭代游标后指定游标方法,则该设置不会应用读取操作。

有关 findOne() 和 find() 方法的更多信息,请参阅以下服务器手册文档:

如果要运行自定义处理管道以从数据库中获取数据,可以使用 aggregate() 方法。此方法接受依序运行的聚合表达式。通过这些表达式,可以对集合中的结果数据进行筛选、分组和排列。

例子

一家披萨餐厅想按需运行状态报告来总结过去一周的披萨订单。为此,它们会对 orders 集合运行以下 aggregate() 查询,从而获取每个不同“状态”字段的总和:

// 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() 方法的可运行示例,请参阅《 使用变更流监控数据 》指南中的 示例 部分。