希望有人能帮我解决一个问题:我需要向数据库进行普通查询,但是我的集合非常大(10000个文档),因此我需要使用$limit
和$skip
进行查询。我已经解决了这部分问题,但现在我想要统计所有文档的数量,即使返回的文档数量较少。输出应该如下所示:
{
count: 1150,
data: [/*length of 50*/]
}
有人可以帮忙吗?非常感谢。
希望有人能帮我解决一个问题:我需要向数据库进行普通查询,但是我的集合非常大(10000个文档),因此我需要使用$limit
和$skip
进行查询。我已经解决了这部分问题,但现在我想要统计所有文档的数量,即使返回的文档数量较少。输出应该如下所示:
{
count: 1150,
data: [/*length of 50*/]
}
有人可以帮忙吗?非常感谢。
由于您提到正在进行普通查询,因此选择聚合操作并不明智。在这里,使用find()将是更好的选择。相反,您可以直接使用find查询。在mongoDB控制台中执行此操作的命令如下:
> var docs = db.collection.find().skip(10).limit(50)
> docs.count()
189000
> docs.length()
50
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
});
});
我认为在不使用聚合的情况下,无法通过单个查询获取结果的总计数和分页数据。
您可能可以通过聚合来实现此目的,但由于您提到集合非常大,因此应避免使用聚合并将查询分成两部分。我提供了一个示例,考虑到具有超过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*/]
}
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();
正如Sarath Nair所提到的,您可以使用count,因为它忽略了skip和limit。请参阅:MongoDB Count
顺便说一下,这是从另一个StackOverflow问题中复制的:Limiting results in MongoDB but still getting the full count?