解决方案的背景
如猫鼬文档和本杰明的答案中所述,该方法Model.count()
已被弃用。除了使用count()
,还可以使用以下替代方法:
Model.countDocuments(filterObject, callback)
计算与集合中的过滤器匹配的文档数。将空对象{}作为过滤器传递将执行完整的集合扫描。如果集合很大,则可以使用以下方法。
Model.estimatedDocumentCount()
此模型方法估计MongoDB集合中的文档数。此方法比以前的方法快countDocuments()
,因为它使用集合元数据而不是遍历整个集合。但是,正如方法名称所暗示的,并且取决于数据库配置,结果是一个估计值,因为元数据可能无法反映方法执行时集合中文档的实际数量。
这两种方法都返回一个猫鼬查询对象,该对象可以通过以下两种方式之一执行。使用.exec()
,如果你想在以后的时间来执行查询。
解决方案
选项1:传递回调函数
例如,使用来计数集合中的所有文档.countDocuments()
:
someModel.countDocuments({}, function(err, docCount) {
if (err) { return handleError(err) } //handle possible errors
console.log(docCount)
//and do some other fancy stuff
})
或者,使用.countDocuments()
以下命令对集合中具有特定名称的所有文档进行计数:
someModel.countDocuments({ name: 'Snow' }, function(err, docCount) {
//see other example
}
选项2:使用 .then()
猫鼬查询具有.then()
“ thenable”的功能。这是为了方便起见,查询本身并不是一个保证。
例如,使用来计数集合中的所有文档.estimatedDocumentCount()
:
someModel
.estimatedDocumentCount()
.then(docCount => {
console.log(docCount)
//and do one super neat trick
})
.catch(err => {
//handle possible errors
})
选项3:使用异步/等待
使用异步/等待方法时,建议的方法是与它一起使用,.exec()
因为它可以提供更好的堆栈跟踪。
const docCount = await someModel.countDocuments({}).exec();
通过堆栈溢出学习