如何使用 async/await 查询 MongoDB?

Posted

技术标签:

【中文标题】如何使用 async/await 查询 MongoDB?【英文标题】:How to query MongoDB using aysnc/await? 【发布时间】:2022-01-11 03:47:02 【问题描述】:

所以我正在学习 Udemy 的课程,学习使用 Node/Express/MongoDB 和使用 mongoose 与数据库交互的 Web 开发。

我参加了一个讲座,讲师开始解释如何查询数据库,所以这里创建了一个猫鼬模型并将其命名为Tour,并在控制器文件中编写了这个来查询数据我们已经像这样导入了:

exports.getAllTours = async (req, res) => 
    try 
        const queryObj =  ...req.query ;
        const exludedFields = ["sort", "limit", "page", "fields"];
        exludedFields.forEach(el => delete queryObj[el]);

        const query = Tour.find(queryObj);

        const tours = await query

        res.status(200).json(
            status: 'success',
            data: 
                tours: tours
            
        )
     catch (err) 
        res.status(404).json(
            status: 'fail',
            message: err.message
        );
    

从上面的代码中可以看出,我们使用处理函数getAllTours 来获取所有通过它处理这条路线app.get('/api/v1/tours/') 的方式。

在讲座开始时,查询代码是这样的:const query = await Tour.find(queryObj);,然后他删除了 await 关键字,看起来像上面的代码,他后来为 tours 对象添加了 await 关键字。

讲师解释说,如果我们在查询中使用 await 像 const query = await Tour.find(queryObj); 那么代码将立即执行,然后我们将无法在查询上链接其他方法,例如 .where() 或 .@ 987654330@.

我需要有人为我解释这些问题:

    如果我们使用await,为什么代码会立即执行? Tour.find()确实需要时间来查询数据库,所以我认为我们应该添加await,不是吗?

【问题讨论】:

【参考方案1】:

Tour.find() 返回一个 promise(是一个异步调用),在它前面添加 await 将等到 promise 被解析并返回它的结果。

如果您想在执行 find 之后执行 where() 您可以在执行查询后执行此操作,因为您将在该对象中获得结果你的情况是 tours 对象。

老实说,我更喜欢 const tours = await Tour.find() 你保存一个有点不必要的变量,如果你想捕捉承诺的错误或类似的东西,这是必要的。

在您的情况下,您使用 try catch,因此如果查询发生问题(连接问题或其他问题),错误将转到 catch 块

【讨论】:

Tour.find() 需要时间来执行,所以我认为我们必须在之前添加 await 对吗?在上面的代码中,他简单地删除了它,为什么?我不想将 .where() 或 .equal() 之类的方法链接到它,我很惊讶他删除了 await。 是的,Tour.find() 需要一些时间才能进入数据库并检索数据。所以 await Tour.find() 就可以了。如果这回答了您的问题,请将其标记为已回答:) 这就是 Diego 的重点,他删除了它!怎么样? 查询变量具有 Tour.find() 在等待查询时返回的承诺,您所做的是等待查询结束并返回结果,只需使用不同的变量

以上是关于如何使用 async/await 查询 MongoDB?的主要内容,如果未能解决你的问题,请参考以下文章

使用 async / await 在 firebase 中运行查询

将 Async/Await 与 node-postgres 一起使用

使用 async/await 进行续集查询的无限循环

在 express (async/await) 中使用一个 mongoose 查询的输出作为另一个查询的输入

使用 async/await 时,Firebase Cloud Firestore 查询返回 Promise <pending> 而不是已完成

在 NodeJs 中使用 async await 和 mariadb 查询的正确方法是啥?