首页 > 解决方案 > 使用 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 参数的情况下使用聚合命令。

我对聚合命令不是很好,因此无法弄清楚如何修改此代码以包含游标选项或解释参数。感谢一些帮助。

标签: angularjsmongodbmongoose

解决方案


经过大量研究,发现这个问题是由于 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 及更高版本。


推荐阅读