我正在MEAN Stack应用程序中开发功能,这将使我能够获取数据库中位于所选位置一定距离内的所有企业的列表。这是我的代码:
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:'cursor'选项是必需的,除了带有explain参数的聚合外”并且我的应用程序不会产生任何结果用户界面。
我在本地环境中运行mongo版本4.0.2,在该环境中出现此错误和行为。当我在使用Mongo 3.2.13版的开发服务器上运行完全相同的代码时,相同的代码将有效运行并成功在UI中发布查询结果。据我了解,我需要在查询中的聚合命令中包含cursor选项或explain参数,因为Mongo 3.6版(及更高版本)不允许在没有光标选项或explain参数的情况下使用聚合命令。
我对aggregate命令不太满意,因此无法弄清楚如何修改此代码以包含cursor选项或解释参数。感谢一些帮助。
答案 0 :(得分:0)
经过大量研究,发现此问题是由于MongoDB和Mongoose的版本不匹配而引起的。发生上述问题是因为我使用的是MongoDB版本4.0.2和Mongoose 4.4.5。 MongoDB 3.6版及更高版本取消了使用无光标选项的聚合命令的功能,除非该命令包含解释参数。降级到MongoDB 3.2版对我来说解决了这个问题。事实证明,即使使用MongoDB 3.6版及更高版本正确地编写了聚合命令(例如,使用带有光标选项或解释参数的聚合命令),5.0之前的Mongoose版本中也存在某种错误,该错误会错误地引发此错误。因此,如果您使用的是MongoDB 3.6+,则应该使用Mongoose 5.0 +。
摘要-避免MongoDB / Mongoose版本不匹配。对于3.6之前的MongoDB版本,请使用Mongoose 4.4.5。对于3.6版以后的MongoDB版本,请使用Mongoose 5.0及更高版本。