如果有人可以帮助我,我真的很感激:我需要对数据库进行正常查询,但由于我的集合非常大(10000个文档),我需要进行查询并使用$limit
和$skip
。那部分我解决但现在我想对所有文件进行计数,即使返回的文件较少。输出应该是这样的:
{
count: 1150,
data: [/*length of 50*/]
}
有人可以帮忙吗?非常感谢你。
答案 0 :(得分:2)
由于您提到您正在进行正常查询,因此进行聚合并不明智。 find()将是一个更好的选择。相反,您可以使用查找查询本身。在mongoDB控制台中执行此操作的命令如下所示:
> var docs = db.collection.find().skip(10).limit(50)
> docs.count()
189000
> docs.length()
50
答案 1 :(得分:1)
您可以使用一个查询本身来执行此操作。在Node.js和Express.js中,您必须像这样使用它才能使用“count”函数以及toArray的“结果”。
var curFind = db.collection('tasks').find({query});
然后你可以像这样运行两个函数(一个嵌套在另一个函数中)
curFind.count(function (e, count) {
// Use count here
curFind.skip(0).limit(10).toArray(function(err, result) {
// Use result here and count here
});
});
答案 2 :(得分:0)
我不认为在单个查询中可以在不使用聚合的情况下获得结果的总计数以及分页数据。
你可以通过聚合实现这一点,但是既然你提到过,你的集合非常大,你应该避免它并将查询分为两部分。我向您提供了一个示例,考虑user
集合中rating
字段的记录超过10,000条:
var finalResult = {};
var query = {
rating: {$gt: 2}
};
// Get first 50 records of users having rating greater than 2
var users = db.user.find(query).limit(50).skip(0).toArray();
// Get total count of users having rating greater than 2
var totalUsers = db.user.cound(query);
finalResult.count = totalUsers;
finalResult.data = users;
你的最终输出可能是:
finalResult == {
count: 1150,
data: [/*length of 50 users*/]
}
希望,这对你有意义。一些着名的技术如Grails在内部做到这一点,以实现分页。
另一种更清洁的方法可能是:
var finalResult = {};
var query = {
rating: {$gt: 2}
};
var cursor = db.user.find(query).limit(50).skip(0);
// Get total count of users having rating greater than 2
// By default, the count() method ignores the effects of the cursor.skip() and cursor.limit()
finalResult.count = cursor.count();;
finalResult.data = cursor.toArray();
答案 3 :(得分:-1)
如Sarath Nair所述,您可以使用count,因为它忽略了skip和limit。检查:MongoDB Count
顺便说一下,这是另一个StackOverflow问题的重复:Limiting results in MongoDB but still getting the full count?