2015-12-09 5 views
1

Я был бы очень признателен, если бы кто-то мог мне помочь: мне нужно сделать обычный запрос к базе данных, но, поскольку моя коллекция очень большая (10000 документов), мне нужно сделать запрос и использовать $limit и $skip. Эта часть, которую я решил, но теперь я хочу иметь счет для всех документов, даже если возвращенные меньше. Результат должен быть примерно таким:MongoDB count и результаты

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

Не могли бы вы помочь? Большое спасибо.

+0

Возможный дубликат (HTTP [Ограничение результатов в MongoDB, но по-прежнему получать полный анализ?]://stackoverflow.com/questions/15300882/limiting-results-in-mongodb-but-still-getting-the-full-count) – Shanoor

ответ

1

Поскольку вы упомянули, что вы делаете обычный запрос, неразумно идти на агрегацию. Найти() будет намного лучше. Вместо этого вы можете использовать сам запрос на поиск. Команды, чтобы сделать это в MongoDB консоли показано ниже:

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

Я не думаю, что это возможно в одном запросе, чтобы получить общее количество результата вместе с страничных данных без используя агрегацию.

Возможно, вы можете достичь этого посредством агрегации, но, поскольку вы упомянули, ваша коллекция очень велика, вам следует избегать ее и разбить запрос на две части. Я обеспечиваю вам пример рассмотрения user коллекции, имеющей rating поле с более чем 10000 записей:

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

Вы можете сделать это с помощью одного самого запроса. В 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  
    }); 
}); 
+0

находится в mongodb 3.x это все еще работает? Я получил toArray не функция – Kim

+0

Я бегу на mongodb v3.2.10, он отлично работает для меня .. – Vibhu

Смежные вопросы