Мангуст предел / смещение и количество запросов
немного странный по производительности запроса... Мне нужно запустить запрос, который делает общее количество документов, а также может возвращать результирующий набор, который может быть ограничен и смещен.
Итак, у меня есть 57 документов в общей сложности, и пользователь хочет, чтобы 10 документов были компенсированы 20.
Я могу придумать 2 способа сделать это, сначала запрос для всех 57 документов (возвращаемых в виде массива), а затем с помощью массива.slice возвращает документы, которые они хотят. Второй вариант-выполнить 2 запроса, первый используя собственный метод "count" монго, затем запустите второй запрос, используя собственные агрегаторы $limit и $skip монго.
Как вы думаете, это лучше? Делать все это в одном запросе или запускать два отдельных?
Edit:
// 1 query
var limit = 10;
var offset = 20;
Animals.find({}, function (err, animals) {
if (err) {
return next(err);
}
res.send({count: animals.length, animals: animals.slice(offset, limit + offset)});
});
// 2 queries
Animals.find({}, {limit:10, skip:20} function (err, animals) {
if (err) {
return next(err);
}
Animals.count({}, function (err, count) {
if (err) {
return next(err);
}
res.send({count: count, animals: animals});
});
});
2 ответа:
Я предлагаю вам использовать 2 запроса:
db.collection.count()
возвращает общее количество элементов. Это значение хранится где-то в Mongo и не вычисляется.
db.collection.find().skip(20).limit(10)
здесь я предполагаю, что вы можете использовать сортировку по некоторому полю, поэтому не забудьте добавить индекс в это поле. Этот запрос тоже будет быстрым.Я думаю, что вы не должны запрашивать все элементы и чем выполнять пропустить и взять, потому что позже, когда у вас есть большие данные у вас будут проблемы с передачей и обработкой данных.
после того, как мне пришлось решать эту проблему самостоятельно, я хотел бы опираться на ответ user854301.
Мангуст ^4.13.8 я смог использовать функцию под названием
toConstructor()
что позволило мне избежать построения запроса несколько раз, когда применяются фильтры. Я знаю, что эта функция доступна и в более старых версиях, но вам придется проверить документы Мангуста, чтобы подтвердить это.следующие использует Bluebird обещает:
let schema = Query.find({ name: 'bloggs', age: { $gt: 30 } }); // save the query as a 'template' let query = schema.toConstructor(); return Promise.join( schema.count().exec(), query().limit(limit).skip(skip).exec(), function (total, data) { return { data: data, total: total } } );
теперь количество запросов будет возвращать Всего записей он соответствовал, и возвращенные данные будут подмножеством общих записей.
обратите внимание:() вокруг запроса (), который создает запрос.