代码之家  ›  专栏  ›  技术社区  ›  Kevin Mangal

在MongoDB中使用Async/Wait时,在应用光标方法之前获取文档总数?

  •  3
  • Kevin Mangal  · 技术社区  · 5 年前

    在使用.find()和应用.sort()、.skip()和.limit()之前,如何获取文档总数?

    传递给.find()的对象最终将由查询参数生成,因此每次计数的结果都不同。我应该使用承诺而不是异步/等待吗?

    app.get('/', async (req, res) => {
      let pageSize = parseInt(req.query.limit) || 250;
      let page = parseInt(req.query.page) || 1;
    
      try {
        let products = await db.collection('Furniture')
          .find({})
          .sort({})
          .skip((page - 1) * pageSize)
          .limit(pageSize)
          .toArray();
        res.json({products});
      } catch (e) { console.log('Error sending products', e); }
    });
    

    count属性应该添加到响应中发送的json中,其中包含符合find()参数的总产品。

    2 回复  |  直到 5 年前
        1
  •  1
  •   wlh    5 年前

    最酷的是 find() , sort() , skip() limit() 他们都返回了 cursor .这意味着它们可以被链接,但也意味着在任何步骤中,您都可以将光标分配给一个变量,并在变量上运行不同的函数,并且在完成后仍然拥有光标。

        let cursor = await db.collection('Furniture').find({})
        /* you want to wrap the following two in try catch as well, probably */
        let count = await cursor.count(); // do something with count then...
    
        let products = await cursor.sort({})
            .skip((page - 1) * pageSize)
            .limit(pageSize)
            .toArray();
    
        2
  •  0
  •   roag92    5 年前

    唯一的方法是,我做了两个查询,一个用于柜台,另一个用于产品。

      try {
        let total = await db.collection('Furniture')
          .find({})
          .count();
    
        let products = await db.collection('Furniture')
          .find({})
          .sort({})
          .skip((page - 1) * pageSize)
          .limit(pageSize)
          .toArray();
    
        res.json({total, products});
      } catch (e) { console.log('Error sending products', e); }