有没有一种方法可以创建“计数”查询并使用cursor.min()/ cursor.max()?

时间:2019-04-30 15:03:38

标签: mongodb

有没有办法可靠地获得最小/最大游标之间的结果计数?


我正在使用cursor.min()cursor.max()cursor.hint()在mongo中建立一些基于光标的分页。我的所有工作都很好,但是我希望能够对这些游标之间的所有条目进行计数。不幸的是,我还没有找到一种方法来使其工作。 count方法似乎忽略了min/max设置。

例如我有以下索引: { group_id: 1, updated_at: 1, _id: 1 }

以下查询:

db.getCollection("my_collection")
  .find({
      group_id: 'gr_cjr7ucmwi00030xqip5ez34ym',
  })
  .hint('sort_updated_at')
  .min({ 
      group_id: 'gr_cjr7ucmwi00030xqip5ez34ym',
      updated_at: ISODate('2019-03-15T17:04:08.094+0000'),
      _id: ObjectId('5cc74f0ff0086e91e6bfb01e'),
     })
  .max({ 
      group_id: 'gr_cjr7ucmwi00030xqip5ez34ym',
      updated_at: ISODate('2019-03-15T17:04:11.735+0000'),
      _id: ObjectId('5cc2076914213d5528e82053'), 
     });

返回10个文档。

但是,如果我向该查询附加.count(),则会得到17,这是包含group_id: 'gr_cjr7ucmwi00030xqip5ez34ym'的文档总数,包括超出光标最小/最大边界的文档的数量。

如果我使用较新的.countDocuments(),它会明确指出.min() is not a function,因此显然不起作用。


注意:我考虑过将最小/最大游标构建到count查询约束中

db.getCollection("my_collection")
  .count({
      group_id: 'gr_cjr7ucmwi00030xqip5ez34ym',
      updated_at: { 
          $gte: ISODate('2019-03-15T17:04:08.094+0000'),
          $lte: ISODate('2019-03-15T17:04:11.735+0000'),
      }
  });

但是,当文档恰好位于最小/最大光标位置之外时,它们具有相同的updated_at值。即即使该条目位于最小光标之前(其_id小于光标中的_id),使用该条目上方的光标也将包括在计数中:

{ 
  group_id: 'gr_cjr7ucmwi00030xqip5ez34ym',
  updated_at: ISODate('2019-03-15T17:04:08.094+0000'),
  _id: ObjectId('5cc74f0ff0086e91e6bfb01d'),
}

0 个答案:

没有答案