如何知道数据已保存的模型数?有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
是一个Object,调用哪个方法可以获得真正的count
?
感谢
答案 0 :(得分:134)
您的代码不起作用的原因是因为count函数是异步的,它不会同步返回值。
以下是一个使用示例:
userModel.count({}, function( err, count){
console.log( "Number of users:", count );
})
答案 1 :(得分:104)
以下代码有效。注意使用count。
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.count({name: 'anand'}, function(err, c) {
console.log('Count is ' + c);
});
}
});
答案 2 :(得分:16)
不推荐使用collection.count,并且在以后的版本中将其删除。改为使用collection。 countDocuments 或collection。 estimatedDocumentCount 。
userModel.countDocuments(query).exec((err, count) => {
if (err) {
res.send(err);
return;
}
res.json({ count: count });
});
答案 3 :(得分:12)
您应该将对象作为参数
userModel.count({name: "sam"});
或
userModel.count({name: "sam"}).exec(); //if you are using promise
或
userModel.count({}); // if you want to get all counts irrespective of the fields
答案 4 :(得分:6)
如猫鼬文档和本杰明的答案中所述,方法Model.count()已过时。除了使用count()之外,还可以使用以下替代方法:
Model.countDocuments(filterObject, callback)
计算与集合中的过滤器匹配的文档数。将空对象{}作为过滤器传递将执行完整的集合扫描。如果集合很大,则可以使用以下方法。
Model.estimatedDocumentCount()
此模型方法估计MongoDB集合中的文档数。此方法比以前的countDocuments()更快,因为它使用集合元数据而不是遍历整个集合。但是,正如方法名称所暗示的那样,并且取决于数据库配置,结果是一个估计值,因为元数据可能无法反映方法执行时集合中文档的实际数量。
两个方法都返回一个猫鼬查询对象,该对象可以通过以下两种方式之一执行。如果要稍后执行查询,请使用.exec()。
1)传递回调函数
例如,使用.countDocuments()对集合中的所有文档进行计数:
SomeModel.countDocuments({}, function(err, count) {
if (err) { return handleError(err) } //handle possible errors
console.log(count)
//and do some other fancy stuff
})
或者,使用.countDocuments()对具有特定名称的集合中的所有文档进行计数:
SomeModel.countDocuments({ name: 'Snow' }, function(err, count) {
//see other example
}
2)使用.then()
猫鼬查询具有.then(),因此它是“ thenable”。这是为了方便起见,查询本身并不是一个保证。
例如,使用.estimatedDocumentCount()对集合中的所有文档进行计数:
SomeModel
.estimatedDocumentCount()
.then(count => {
console.log(count)
//and do one super neat trick
})
.catch(err => {
//handle possible errors
})
希望这会有所帮助!
答案 5 :(得分:1)
这里投票得最高的答案非常好,我只想累加 await 的用法,以便可以将要求的功能存档:
const documentCount = await userModel.count({});
console.log( "Number of users:", documentCount );
由于不建议继续使用,建议在“ count()”上使用 countDocuments()。因此,到目前为止,完美的代码应该是:
const documentCount = await userModel.countDocuments({});
console.log( "Number of users:", documentCount );
答案 6 :(得分:0)
使用mongoose.js可以计数文档
const count = await Schema.countDocuments(); // count all
const count = await Schema.countDocuments({ key: value }); // count specific
答案 7 :(得分:-1)
如前所述,您的代码将无法正常工作。解决方法是使用回调函数,但是如果你认为它会带你进入“回调地狱”,你可以搜索" Promisses"。
使用回调函数的可能解决方案:
//DECLARE numberofDocs OUT OF FUNCTIONS
var numberofDocs;
userModel.count({}, setNumberofDocuments); //this search all DOcuments in a Collection
如果要根据查询搜索文档数,可以执行以下操作:
userModel.count({yourQueryGoesHere}, setNumberofDocuments);
setNumberofDocuments是一个separeted函数:
var setNumberofDocuments = function(err, count){
if(err) return handleError(err);
numberofDocs = count;
};
现在,您可以使用getFunction获取任何文档的数量:
function getNumberofDocs(){
return numberofDocs;
}
var number = getNumberofDocs();
此外,您可以使用回调函数在同步函数中使用此异步函数,例如:
function calculateNumberOfDoc(someParameter, setNumberofDocuments){
userModel.count({}, setNumberofDocuments); //this search all DOcuments in a Collection
setNumberofDocuments(true);
}
希望它可以帮助别人。 :)