angularjs - 使用 mongo 查询的 Angular JS 代码未将查询结果发布到 UI
问题描述
我正在我的 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: 'cursor' 选项是必需的,除了带有解释参数的聚合”并且我的应用程序不会在 UI 上产生任何结果。
我在我的本地环境中运行 mongo 版本 4.0.2,我得到这个错误和行为。当我在使用 Mongo 版本 3.2.13 的开发服务器上运行完全相同的代码时,相同的代码可以有效地运行并成功地在 UI 中发布查询结果。据我了解,我需要在查询中包含 cursor 选项或 explain 参数和 aggregate 命令,因为 Mongo 3.6 版(及更高版本)不允许在没有 cursor 选项或 explain 参数的情况下使用聚合命令。
我对聚合命令不是很好,因此无法弄清楚如何修改此代码以包含游标选项或解释参数。感谢一些帮助。
解决方案
经过大量研究,发现这个问题是由于 MongoDB 和 Mongoose 的版本不匹配造成的。出现上述问题是因为我使用的是 MongoDB 版本 4.0.2 和 Mongoose 4.4.5。MongoDB 3.6 版以后删除了在没有光标选项的情况下使用聚合命令的能力,除非该命令包含解释参数。降级到 MongoDB 版本 3.2 为我解决了这个问题。事实证明,在 5.0 之前的 Mongoose 版本中也存在某种错误,即使聚合命令是使用 MongoDB 3.6 及更高版本正确编写的(即,使用带有游标选项或解释参数的聚合命令),也会错误地抛出此错误。所以如果你使用 MongoDB 3.6+,你应该使用 Mongoose 5.0+。
总结 - 避免 MongoDB/Mongoose 版本不匹配。对于 3.6 之前的 MongoDB 版本,请使用 Mongoose 4.4.5。对于 3.6 后的 MongoDB 版本,请使用 Mongoose 5.0 及更高版本。
推荐阅读
- java - MVP android项目的包结构
- swift - Square Connect CreateCheckOut Swift
- vba - 工作表打开时自动弹出 Excel 表单
- ios - CSS 内联样式选择器不适用于 iOS(safari、chrome)
- graph-theory - 生成模型 VS。配置模型
- ruby-on-rails-4 - 找不到现有路线
- c# - 保护连接字符串
- python - Django migrate 返回 1064 - 您的 SQL 语法有错误
- visual-studio-code - 使水平滚动条在 Visual Studio 代码中更明显
- javascript - 如何通过javascript清除应用程序的撤消历史记录