将 geoNear 查询与另一个值查询结合起来

2024-02-01

我有一个使用 node.js mongodb 和 mongoose 实现的地理数据 api。 我想用两个条件查询我的数据。

首先,我使用 geoNear 来获取给定半径内的所有位置,效果很好。 其次,我想按类型进一步过滤位置。

这是我的架构:

var GeoLocationSchema   = new Schema({
    name: String,
    type: String,
    loc: {
        type: {
            type: String,
            required: true,
            enum: ["Point", "LineString", "Polygon"],
            default: "Point"
        },
        coordinates: [Number]
    }
});
// ensure the geo location uses 2dsphere
GeoLocationSchema.index({ loc : "2dsphere" });

这是我的 geoNear 查询:

router.route("/locations/near/:lng/:lat/:type/:max")

    // get locations near the get params
    .get(function(req, res) {
        // setup geoJson for query
        var geoJson             = {};
        geoJson.type            = "Point";
        geoJson.coordinates     = [parseFloat(req.params.lng), parseFloat(req.params.lat)];

        // setup options for query
        var options             = {};
        options.spherical       = true;
        options.maxDistance     = parseInt(req.params.max)/6370000;

        // query db with mongoose geoNear wrapper
        GeoLocation.geoNear(geoJson, options, function (err, results, stats) {
            if (err)
                res.send(err);
            res.json(results);
        });
    });

是否可以将 geoNear 查询与特定类型位置的查询结合起来,或者我可以以某种方式过滤结果吗?

提前致谢。


只要您的 MongoDB 服务器足够新,是 2.6 或更高版本,那么此功能实际上已移至通用查询引擎。这里的 mongoose 方法包装了.runCommand()表单被认为在所有未来版本中已弃用,因此只需使用附加运算符放置标准查询即可。

GeoLocation.find({
    "$nearSphere": {
        "$geometry": {
            "type": "Point",
            "coordinates": [parseFloat(req.params.lng), parseFloat(req.params.lat)] 
        },
        "$maxDistance": distanceInMeters
    },
    "loc.type": "Point"
},function(err,docs) {

   // The documents are also mongoose document objects as well
});

查看更多选项$nearSphere http://docs.mongodb.org/manual/reference/operator/query/nearSphere/或其他选项的运算符。这里的主要区别是$maxDistance使用 GeoJSON 形式时以米为单位,否则以弧度为单位。

当然还有$geoNear http://docs.mongodb.org/manual/reference/operator/aggregation/geoNear/聚合管道的运算符。从 MongoDB 2.4 开始可用,并且可以采用其他选项(例如“查询”)来进一步缩小结果范围。这里的另一个可能的优点是,它将一个字段“投影”到结果中,表示距查询点的“距离”。这可以用于其他计算或自定义排序:

GeoLocation.aggregate(
    [
        { "$geoNear": {
            "near": {
                "type": "Point",
                "coordinates": [parseFloat(req.params.lng), parseFloat(req.params.lat)]
            },
            "distanceField": "distance",
            "maxDistance": distanceInMeters,
            "spherical": true,
            "query": { "loc.type": "Point" }
        }},
        { "$sort": { "distance": -1 } } // Sort nearest first
    ],
    function(err,docs) {

       // These are not mongoose documents, but you can always cast them
    }
);

其他需要注意的区别是,在标准查询形式中,结果不再像“命令”形式那样限制为 100 个文档。聚合$geoNear默认情况下,结果限制为 100 个文档,但可以使用管道命令的附加“限制”选项来调整返回的文档数量。聚合语句不会对除搜索返回的最大文档之外的结果进行“排序”,这些结果是给定条件的顶部结果,但它们不会按顺序返回,因此您需要如图所示对它们进行排序。

在任何一种情况下,您都应该移动代码以使用这两种形式中的任何一种,因为命令形式已被视为已弃用,并将在将来被删除。猫鼬 API 是否保留其方法作为其中一种形式的“包装器”尚不清楚,但大多数可能性不大,因此最好坚持使用受支持的形式。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 geoNear 查询与另一个值查询结合起来 的相关文章

随机推荐

  • 如何使用 jQuery UI 滑块动态更新 highcharts

    我正在寻找一种根据 jQuery UI 滑块确定的值动态更新 Highcharts 的方法 我还不太熟悉 AJAX 或 JSON 所以我运气不太好 我试图让收入在给定的月份内逐步增加 例如订阅服务 为了方便起见 我把它放在 jsFiddle
  • 如何测试预处理器符号是否#define'd但没有值?

    使用 C 预处理器指令 是否可以测试预处理器符号是否已定义但没有值 像这样的东西 define MYVARIABLE if defined MYVARIABLE MYVARIABLE blablabla endif EDIT 我这样做的原因
  • 从子进程触发 root 方法时的上下文

    我有这个非常简单的测试视图
  • 为什么 as_const 禁止右值参数?

    我想问为什么as const禁止右值参数 根据 http en cppreference com w cpp utility as constcppreference com 即为什么标准人员这样做 而不是为什么 cppreference
  • Play Framework 2 存储用户密码哈希的最佳方式

    我的应用程序中有一个添加用户选项 我想将用户密码以哈希格式存储在数据库中 密码以纯文本格式存储在框架附带的示例代码中 经过一番搜索后 我发现 play2 中实现了一个 Crypto encryptAES 函数 可用于保护密码 我的问题是使用
  • Chrome 调试器,水平滚动条在悬停时阻止变量值

    这种情况已经发生了几个星期了 在网上找不到任何东西 有人知道发生了什么事以及如何解决它吗 Screenshot 注意 我将鼠标悬停在包含字符串的变量上 这里真正的解决方法是在控制台窗口中放大 缩小 或者使用 Ctrl 0 重置缩放
  • 当 C++ 线程退出时,内存是否保持分配状态?

    我在 Linux 上使用 pthread 库 我在线程 A 中分配一个字符串 然后尝试在线程 B 中打印该字符串 但是 该字符串只是打印出空 我已经验证它在线程 A 中工作 注意 该字符串驻留在一个对象内 我怀疑该对象可能会被清理或重新实例
  • Vim 中的自动换行(保留缩进)

    我只是在看这个帖子 https stackoverflow com questions 744159 word wrap in gvim描述了如何在 vim 中将整个单词换行 接受的解决方案是这样的 set formatoptions l
  • 如何仅在 SQL Server 中选择未提交的行?

    我正在从事 DW 项目 我需要查询实时 CRM 系统 标准隔离级别会对性能产生负面影响 我很想使用未提交读取的无锁 事务隔离级别 我想知道有多少选定的行被脏读识别 也许你可以这样做 SELECT FROM T WITH SNAPSHOT E
  • JConsole 通过 ssh 本地端口转发

    我希望能够远程连接到公开了 JMX 的 Java 服务 但它被防火墙阻止了 我尝试使用 ssh 本地端口转发 但连接失败 查看wireshark 当您尝试连接jconsole时 它似乎在连接到端口9999后希望通过一些临时端口进行连接 这些
  • 创建动态实现接口的类

    我正在尝试编写一段代码 允许用户加载程序集 DLL 文件 在所述程序集中选择一个接口 然后生成一个继承该接口的类 并带有所有必需方法的存根 该类将生成到文件中或活动的 VS 会话中 该代码旨在在通过自定义模板创建项目期间初始化的 IWiza
  • StackView isHidden 属性未按预期更新

    我正在尝试更新UIStackView以便显示一个字段 如果 a 的值UITextField equal Other 这是我的代码 IBOutlet var stackView UIStackView func updateView prin
  • 附加到不带标题的 CSV 文件

    我在用opencsv http opencsv sourceforge net 将 Java bean 写入带有标题的 CSV 文件 文件名包含当前日期 如果用户在同一天第二次运行它 它会追加到文件中 但会添加另一个标题行 如何附加到文件但
  • jqGrid for Twitter Bootstrap [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 仅在 50 毫秒后显示微调器

    我有一个页面 其中发生了很多 ajax 操作 我显示了一个微调器来指示正在处理请求 其中一些请求需要很长时间 而另一些请求则很快 当响应来得很快时 那些旋转器就更像是一种麻烦而不是一种帮助 这就是我想要的 仅当请求提交后超过 50 毫秒时才
  • cefsharp如何拦截xhr请求以获取响应正文值?

    CefSharp是否能够拦截XHRHttpRequest并获取响应正文值 如果是 我想知道它是如何完成的 我为此创建了以下类并从中返回它的实例IRequestHandler GetResourceResponseFilter interna
  • StringConcatFactory 中的策略

    我知道 invokedynamic 指令 我也知道它的实现的基本过程 但当我到达代码时 我无法理解其中的代码StringConcatFactory 能告诉我这六种策略的源码是如何实现的吗 也只完成了默认策略 作为一名大学生 我无法下源代码
  • CountDownTimer 更新和阻塞

    如果正确理解 CountDownTimer 它不会在启动它的活动的单独线程上运行 那么这是否意味着如果我在主活动中启动 CountDownTimer 并且稍后在该活动中阻塞另一段代码 这是否意味着 CountDownTimer 将不再更新
  • Oracle DBMS_LOB.WRITEAPPEND 到 Postgres 转换

    有人可以告诉我如何将下面的 Oracle 代码转换为 Postgresql IF prodNum 1 THEN DBMS LOB WRITEAPPEND pkgFilterNode LENGTH pkgFilter tab
  • 将 geoNear 查询与另一个值查询结合起来

    我有一个使用 node js mongodb 和 mongoose 实现的地理数据 api 我想用两个条件查询我的数据 首先 我使用 geoNear 来获取给定半径内的所有位置 效果很好 其次 我想按类型进一步过滤位置 这是我的架构 var