MongoDB计数和结果

3

希望有人能帮我解决一个问题:我需要向数据库进行普通查询,但是我的集合非常大(10000个文档),因此我需要使用$limit$skip进行查询。我已经解决了这部分问题,但现在我想要统计所有文档的数量,即使返回的文档数量较少。输出应该如下所示:

{
     count: 1150,
     data: [/*length of 50*/]
}

有人可以帮忙吗?非常感谢。


可能是在MongoDB中限制结果但仍然获得完整计数?的重复问题。 - Shanoor
4个回答

5

由于您提到正在进行普通查询,因此选择聚合操作并不明智。在这里,使用find()将是更好的选择。相反,您可以直接使用find查询。在mongoDB控制台中执行此操作的命令如下:

> var docs = db.collection.find().skip(10).limit(50)
> docs.count()
189000
> docs.length()
50

1
你可以使用一个查询来完成这个操作。在 Node.js 和 Express.js 中,您需要像这样使用它,才能使用 "count" 函数以及 toArray 的 "result"。
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    
    });
});

在MongoDB 3.x中,这仍然有效吗?我得到了“toArray不是一个函数”的错误。 - Kim

0

我认为在不使用聚合的情况下,无法通过单个查询获取结果的总计数和分页数据。

您可能可以通过聚合来实现此目的,但由于您提到集合非常大,因此应避免使用聚合并将查询分成两部分。我提供了一个示例,考虑到具有超过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();

-1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接