mongoose 从DB中获取一些文档的正确方法(Mongo)

vxbzzdmp  于 2023-01-21  发布在  Go
关注(0)|答案(1)|浏览(139)

你好,提前感谢!
我是MERN堆栈的学生,我也刚刚开始了解MVC设计模式。
所以,我的问题是:
我尝试从Mongo集合中获取一些文档(使用Mongoose),但我的请求中包含一个限制查询(假设我只需要30个文档集合中的前5个文档)。一般来说,什么是最佳实践?您会在不同的情况下使用其中之一吗(例如,数据库有多大,作为一个想到的例子)?
大概是这样的
控制器:

getProducts() {
    const { limit } = req.query;
    const products = await productManagerDB.getProducts();
    res.status(200).json({ success: true, limitedProductsList: products.slice(0, Number(limit))});
}

或者
就像这样:
控制器:

getProducts() {
    const { limit } = req.query;
    const products = await productManagerDB.getProducts(limit);
    res.status(200).json({ success: true, limitedProductsList: products});
}

服务:

getProducts(query) {
    try {
       const limit = query? Number(query) : 0;
       const products = await ProductsModel.find().limit(limit);
       return products;
    } catch (error) {
        throw new Error(error.message)
    }
}

尝试了两种方法,结果相同。我希望第二种方法更有效,因为它不会加载我不使用的所有数据,但我很好奇,如果在某些情况下,提取整个集合会更好...

xesrikrc

xesrikrc1#

正如您已经指出的,第二个查询要高效得多--尤其是当您有一个大型集合时。两个区别是:

  1. MongoDB引擎必须从磁盘中获取所有文档--这是MongoDB的设计方式(内部wired-tiger存储引擎)的优势在于,它将频繁使用的数据缓存在应用程序缓存或操作系统缓存中-无论如何,很有可能整个集合将不适合内存,因此将发生大量磁盘操作(即使使用最新的nvme磁盘,速度也非常慢)
    1.大量的数据将不得不通过网络从数据库服务器流向应用程序服务器,这不仅浪费带宽,而且速度会更慢。

您可能需要完整集合的位置显然取决于使用情形

相关问题