Мангуст предел / смещение и количество запросов


немного странный по производительности запроса... Мне нужно запустить запрос, который делает общее количество документов, а также может возвращать результирующий набор, который может быть ограничен и смещен.

Итак, у меня есть 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 54

2 ответа:

Я предлагаю вам использовать 2 запроса:

  1. db.collection.count() возвращает общее количество элементов. Это значение хранится где-то в Mongo и не вычисляется.

  2. 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 }
    }
);

теперь количество запросов будет возвращать Всего записей он соответствовал, и возвращенные данные будут подмножеством общих записей.

обратите внимание:() вокруг запроса (), который создает запрос.