Угловой код JS с использованием монго-запроса не публикует результаты запроса в пользовательском интерфейсе - PullRequest
0 голосов
/ 14 января 2019

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

if (fullAddress) {

        queryAdvns = Listing.aggregate().near(
            {
                near: {type: 'Point', coordinates: [lng, lat]},
                distanceField: 'distance',
                maxDistance: within,
                query: query._conditions,
                spherical: true,
                distanceMultiplier: 0.00062137,
                num: 1000,
                limit: 1000
            });

        queryCount = Listing.aggregate().near(
            {
                near: {type: 'Point', coordinates: [lng, lat]},
                distanceField: 'distance',
                maxDistance: within,
                query: query._conditions,
                spherical: true,
                distanceMultiplier: 0.00062137,
                num: 1000,
                limit: 1000
            });
    }

    if (fullAddress) {

        logger.info("Searching by Distance");
        queryCount
            .limit(1000)
            .exec(function (err, list) {

                logger.info("Counting Advance Search Result");
                if (!err) {

                    var newLimit = limit + skip;

                    queryAdvns
                        .sort(sort)
                        .limit(newLimit)
                        .skip(skip)
                        .exec(function (err, result) {
                            res.json({
                                searchResult: result,
                                count: list.length
                            });
                        });

                } else {
                    return next(err);
                }

            });


    }

Когда я запускаю запрос в своем приложении, я получаю следующее сообщение об ошибке: «ошибка: MongoError: требуется опция« курсор », за исключением агрегирования с аргументом объяснения», и мое приложение не выдает никаких результатов при пользовательский интерфейс.

Я использую Mongo версии 4.0.2 в своей локальной среде, где я получаю эту ошибку и поведение. Когда я запускаю точно такой же код на моем сервере разработки, который использует Mongo версии 3.2.13, тот же код выполняется эффективно и успешно публикует результаты запроса в пользовательском интерфейсе. Из того, что я понимаю, мне нужно включить опцию курсора или аргумент объяснения с помощью команды агрегата в запросе, потому что в версии 3.6 (и выше) Mongo запрещено использование команды агрегата без опции курсора или аргумента объяснения.

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

1 Ответ

0 голосов
/ 05 февраля 2019

После долгих исследований обнаружил, что эта проблема возникает из-за несоответствия между версиями MongoDB и Mongoose. Описанная выше проблема возникла из-за того, что я использовал MongoDB версии 4.0.2 и Mongoose 4.4.5. В версии 3.6 MongoDB удалена возможность использовать команду агрегирования без опции курсора, если только команда не содержит аргумент объяснения. Переход на MongoDB версии 3.2 решил эту проблему для меня. Оказывается, есть также какая-то ошибка в версиях Mongoose до 5.0, которая некорректно генерирует эту ошибку, даже если агрегатная команда правильно написана с использованием MongoDB версий 3.6 и выше (то есть, с использованием агрегатной команды с параметром курсора или аргумент объяснения). Поэтому, если вы используете MongoDB 3.6+, вам следует использовать Mongoose 5.0+.

Резюме - избегайте несоответствия версий MongoDB / Mongoose. Для версий MongoDB до 3.6 используйте Mongoose 4.4.5. Для версий MongoDB, начиная с 3.6, используйте Mongoose 5.0 и выше.

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