如何得到猫鼬模型的全部计数?

我如何知道数据已经保存的模型的计数?有一种 Model.count()的方法,但似乎行不通。

var db = mongoose.connect('mongodb://localhost/myApp');
var userSchema = new Schema({name:String,password:String});
userModel =db.model('UserList',userSchema);
var userCount = userModel.count('name');

userCount是一个对象,调用哪个方法可以得到一个真正的 count

谢谢

270960 次浏览

下面的代码可以工作。请注意 文件的使用。

 var mongoose = require('mongoose');
var db = mongoose.connect('mongodb://localhost/myApp');
var userSchema = new mongoose.Schema({name:String,password:String});
var userModel =db.model('userlists',userSchema);
var anand = new userModel({ name: 'anand', password: 'abcd'});
anand.save(function (err, docs) {
if (err) {
console.log('Error');
} else {
userModel.countDocuments({name: 'anand'}, function(err, c) {
console.log('Count is ' + c);
});
}
});

代码无法工作的原因是 count 函数是异步的,它不同步返回值。

下面是一个用法的例子:

userModel.count({}, function( err, count){
console.log( "Number of users:", count );
})

如前所述,您的代码不会按照原来的方式工作。一个解决方案是使用回调函数,但是如果你认为它会把你带到“回调地狱”,你可以搜索“承诺”。

使用回调函数的可能解决方案:

//DECLARE  numberofDocs OUT OF FUNCTIONS
var  numberofDocs;
userModel.count({}, setNumberofDocuments); //this search all DOcuments in a Collection

如果你想根据一个查询搜索文档的数量,你可以这样做:

 userModel.count({yourQueryGoesHere}, setNumberofDocuments);

SetNumberofDocument 是一个独立的函数:

var setNumberofDocuments = function(err, count){
if(err) return handleError(err);


numberofDocs = count;


};

现在,您可以使用 getFunction 在任何地方获取 Document 的数量:

     function getNumberofDocs(){
return numberofDocs;
}
var number = getNumberofDocs();

此外,通过使用回调,您可以在同步函数中使用这个异步函数,例如:

function calculateNumberOfDoc(someParameter, setNumberofDocuments){


userModel.count({}, setNumberofDocuments); //this search all DOcuments in a Collection


setNumberofDocuments(true);




}

你应该给一个对象作为参数

userModel.countDocuments({name: "sam"});

或者

userModel.countDocuments({name: "sam"}).exec(); //if you are using promise

或者

userModel.countDocuments({}); // if you want to get all counts irrespective of the fields

对于老版本的猫鼬,使用

userModel.count({name: "sam"});

不推荐使用 Collection.count,将在以后的版本中删除它。

userModel.countDocuments(query).exec((err, count) => {
if (err) {
res.send(err);
return;
}


res.json({ count: count });
});

解决方案的背景

正如在猫鼬文档和 Benjamin 的答案中所述,Model.count()方法是不赞成的。除了使用 count()之外,还有以下几种方法:

Model.countDocuments(filterObject, callback)

计算集合中有多少文档匹配筛选器。将空对象{}作为筛选器传递将执行完整的集合扫描。如果集合较大,则可能使用下列方法。

Model.estimatedDocumentCount()

此模型方法估计 MongoDB 集合中的文档数量。此方法比以前的 countDocuments()快,因为它使用集合元数据,而不是遍历整个集合。但是,正如方法名所示,根据 db 配置,结果是一个估计值,因为元数据可能不反映方法执行时集合中文档的实际计数。

这两种方法都返回一个 monose 查询对象,可以通过以下两种方式之一执行该查询对象。如果希望以后执行查询,请使用 .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(),因此它是“可变的”。这是为了方便起见,而查询本身并不是一个承诺。

例如,使用 .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();

堆积如山的学习,

这里投票最多的答案完全没问题,我只是想把 等待的使用加起来,这样就可以实现所要求的功能:

const documentCount = await userModel.count({});
console.log( "Number of users:", documentCount );

建议使用 文件()而不使用‘ count ()’,因为它将被不推荐使用。所以,目前来说,完美的代码应该是:

const documentCount = await userModel.countDocuments({});
console.log( "Number of users:", documentCount );

使用 mongose.js 可以计算文档,

  • 统计一下
const count = await Schema.countDocuments();
  • 具体数目
const count = await Schema.countDocuments({ key: value });

Model.count()方法在猫鼬版本6.2.0中不被推荐。如果你想要计算一个集合中的文档数量,例如 count({}),那么使用 estimatedDocumentCount()函数。否则,改用 countDocuments()函数。

Model.estimatedDocumentCount()估计 MongoDB 集合中的文档数量。对于大型集合,它比使用 countDocuments()更快,因为 EstiatedDocumentCount ()使用集合元数据,而不是扫描整个集合。

例如:

const numAdventures = await Adventure.estimatedDocumentCount();

参考资料: https://mongoosejs.com/docs/api.html#model_Model.estimatedDocumentCount