Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在MongoDB中对聚合查询结果进行分页,并获得文档总数(Node.js+;Mongoose)?_Javascript_Node.js_Mongodb_Mongoose - Fatal编程技术网

Javascript 如何在MongoDB中对聚合查询结果进行分页,并获得文档总数(Node.js+;Mongoose)?

Javascript 如何在MongoDB中对聚合查询结果进行分页,并获得文档总数(Node.js+;Mongoose)?,javascript,node.js,mongodb,mongoose,Javascript,Node.js,Mongodb,Mongoose,我想通过$limit和$skip对查询结果进行分页,并获得通过查询的文档总数 我现在要做的是对结果进行分页: const startIndex = (page - 1) * limit const endIndex = page * limit const resultObject = {} resultObject.totalCount = await model.countDocuments(query).exec() if (endIndex < result

我想通过$limit和$skip对查询结果进行分页,并获得通过查询的文档总数

我现在要做的是对结果进行分页:

  const startIndex = (page - 1) * limit
  const endIndex = page * limit
  const resultObject = {}

  resultObject.totalCount = await model.countDocuments(query).exec()

  if (endIndex < results.totalCount)
    resultObject.next = {page: page + 1, limit}

  if (startIndex > 0)
    results.prev = {page: page - 1, limit}

  resultObject.results = await query.limit(limit).skip(startIndex).exec()
const startIndex=(第1页)*限制
const endIndex=页面*限制
常量resultObject={}
resultObject.totalCount=await model.countDocuments(query.exec())
if(endIndex0)
results.prev={page:page-1,limit}
resultObject.results=wait query.limit(limit).skip(startIndex.exec())
这会产生两个问题:

  • 我执行了两次查询(你能在1中执行吗?)
  • 由于某种原因,当我的查询是聚合时,
    countDocuments
    返回0,即使当我执行
    query.exec()
    时,我得到了正确的结果(>0)
因此,我的问题是,在获取文档计数的同时,如何像现在一样只使用1个查询对结果进行分页(并使用聚合查询),以便构建我的
resultObject
  • “我执行了两次查询(你能在1中执行吗?”“不,你不能,实现这一点的唯一方法是获取整个集合,然后在代码中返回所需的文档,这显然是一个非常糟糕的解决方案

  • 这有点棘手,从技术上讲,这是一个只执行管道的包装器:

该方法使用$sum表达式包装$group聚合阶段以执行计数

意义

db.collection.countDocuments({});
等于:

db.collection.aggregate([
    {
        $group: {
            _id: null,
            count: {$sum: 1}
        }
    }
]);
但是,不同的驱动程序支持此命令的方式不同,例如,
nodejs
Mongo驱动程序不允许按指定使用某些表达式。您还使用了
mongoose
,这可能会有额外的更改


如果不查看您的确切查询,很难说它失败的原因,但是如果您找不到原因,我建议只执行包装管道。

我找到了一种方法,可以在数据库的同一“行程”中获得查询结果和计数(仍有2个查询,但在数据库中,因此速度要快得多)

关键是要使用
$facet
(mongodb 3.4+):

解释
$facet
在同一输入(我们的查询结果)上执行多个管道。我们可以有1个管道用于对结果分页,1个管道用于计算总数

由于
$count
返回一个包含
count
字段的对象,并且facet包装在一个数组中,
$addFields
管道将实际的
count
值提取为
total
字段。然后我只使用
$project
删除不再需要的
totalCount
,结果如下:

  {
     paginatedResults: [RESULTS],
     total: 34
  }
  {
     paginatedResults: [RESULTS],
     total: 34
  }