В серверной части Node.js для приложения React.js я использую
"mongodb" (as db.version returns): "3.4.10",
"mongoose": "5.3.4"
Я изучил проблему и обнаружил, что это может быть из-за версии mongoDb, которую я использую. Итак, я попытался переключить mongoDb на 3.4.X, но все равно получаю то же сообщение об ошибке:
"MongoError: unknown top level operator: $expr"
из-за этой строки кода:
match.$expr = {
$lt: ["$distance", "$range"] // "calculated_distance < tutor_range"
}
Вы знаете почему? Вот полный метод, если вам когда-нибудь понадобится более подробная информация о нем.
exports.search = (req, res) => {
let lat1 = req.body.lat;
let lon1 = req.body.lng;
let page = req.body.page || 1;
let perPage = req.body.perPage || 10;
let radius = req.body.radius || 10000;
let levelsIn = req.body.levels && req.body.levels.length !== 0 ? req.body.levels.map(level => {
return ObjectID(level);
}) : null;
let subjectsIn = req.body.subjects && req.body.subjects.length !== 0 ? req.body.subjects.map(subject => {
return ObjectID(subject);
}) : null;
var options = { page: page, limit: perPage, sortBy: { updatedDate: -1 } }
const isAdmin = req.user ? req.user.role === "admin" || req.user.role === "super-admin" : false;
let match = {}
if (levelsIn) match.levels = { $in: levelsIn };
if (subjectsIn) match.subjects = { $in: subjectsIn }
if (typeof req.body.activated !== "undefined") match.profileActivated = req.body.activated;
if (req.body.from) match.createdAt = { $gte: new Date(req.body.from) };
if (req.body.to) {
if (match.createdAt) match.createdAt.$lte = new Date(req.body.to);
else match.createdAt = { $lte: new Date(req.body.to) };
}
var aggregate = null;
if (!isAdmin) {
match.activated = true
match.profileActivated = true
match.profileOnline = true
}
if (lat1 && lon1) {
match.$expr = {
$lt: ["$distance", "$range"] // "calculated_distance < tutor_range"
}
aggregate = Tutor.aggregate([
{
"$geoNear": {
"near": {
"type": "Point",
"coordinates": [lon1, lat1]
},
"distanceField": "distance", // this calculated distance will be compared in next section
"distanceMultiplier": 0.001,
"spherical": true
}
},
{
$match: match
}
]);
} else {
aggregate = Tutor.aggregate([
{
$match: match
}
]);
}
Tutor
.aggregatePaginate(aggregate, options, function (err, result, pageCount, count) {
if (err) {
return res.status(400).send(err);
}
else {
var opts = [
{ path: 'levels', select: 'name' },
{ path: 'subjects', select: 'name' },
{ path: 'assos', select: 'name' }
];
Tutor
.populate(result, opts)
.then(result2 => {
return res.send({
page: page,
perPage: perPage,
pageCount: pageCount,
documentCount: count,
tutors: result2
});
})
.catch(err => {
return res.status(400).send(err);
});
}
})
};
Большое спасибо за ответы и помощь!
При вводе mongod --version или mongo -version в командной строке у меня v.3.6.3
Стоит ли мне также обновить версию mongodb до 3.6.x?
Попробуйте также обновить версию мангуста до 5.x и установить коэффициент совместимости функций docs.mongodb.com/manual/reference/command/…
Для какой версии мне следует установить коэффициент совместимости функций? Это большие изменения в моем приложении для небольшой проблемы .. Мне нужно обновить все устаревшие методы из мангуста: s Это единственный способ? Я не уверен, что это сработает
Вы должны обновить мангуста до 5.x. Версии Mongoose до 5.0 неправильно соответствуют MongoDB 3.6. И запустите эту команду в оболочке mongo, чтобы установить коэффициент совместимости 3,6 db.db.adminCommand( { setFeatureCompatibilityVersion: "3.6" } )
К сожалению, это не решает проблему: s
Хорошо, последняя попытка удалить все поля из запроса и просто запустить. db.collection.find({ $expr: { $lt: ["$distance", "$range"] } }) и проверьте ошибку.
Я все еще получаю ту же ошибку
ты обновился до 3.6? Если да, то почему версия говорит 3.4.10
В соответствии с ; mongoosejs.com/docs/compatibility.html, MongoDB Server 3.4.x совместим с mongoose 5.x, поэтому я не обновлял его до 3.6
$ expr доступен в версии 3.6. поэтому вам нужно обновить, чтобы использовать $ expr независимо от версии мангуста.
Да, конечно. Дело в том, что я боюсь, что обновление до 3.6 сломает многие вещи. Есть ли другой способ добиться того, чего я хочу, чем использовать $ expr?





Это собственная версия драйвера mongodb (
"mongodb": "^2.2.36"), а не версия mongodb. Проверьте свою версию mongodb с помощью оболочки mongo, а также обновите версию mongoose до 5.x