我正在整理一个移动 meteor 应用程序,该应用程序用于列出本地(例如20英里范围内)的便利设施。我收集了这些便利设施以及相应的latlng数据-我希望能够将应用程序传递到我的当前位置(使用Cordova)并生成一个列表(/collection?),该列表排在最前面。

我有两个具体的问题,我非常感谢您提供一些建议!

我可以为此使用mongo的$near还是应该使用node.js附加组件(例如'GeoLib'-https://github.com/manuelbieh/geolib)进行距离计算?

如何生成这些位置的临时(本地存储)集合以显示在列表中?大概如果我不使用$near,我必须遍历我的位置,计算所有位置的距离,然后返回该距离在某个阈值以下的任何位置,但是当我的位置列表出现时,这似乎是一种昂贵的方法会成长。

抱歉,这是我第一次尝试这种方法。我真的很感谢经验更丰富的开发人员的任何建议!

编辑-我的代码(为什么不起作用?!)

我将这样的位置存储在集合中:
Beaches.insert({ name: 'Venice Beach CA', geometry: { type: "Point", coordinates: [-118.473314,118.473314] } });
...
Beaches._ensureIndex({'geometry.coordinates':'2d'}, function(err, result) { if(err) return console.dir(err); });
我正在查询这些条目(传递lat和lng):
getNearBeaches = function(lng,lat) { return Beaches.find({'geometry.coordinates': { $near: { $geometry: { type: "Point", coordinates: [lng,lat] } }, $maxDistance: 20000 //meters } })};
我可以使用直接的find()列出我的收藏集,但是即使将$ maxDistance设置为一个很大的数字,我的位置搜索也不会返回任何内容,或者直接在已经存储的一组坐标上搜索。

我做错了什么?

最佳答案

您可以获取当前位置,将其发送到服务器并订阅集合,并通过mongodb $near进行过滤:

Meteor.subscribe("amenities", {latlng: Session.get("latlng")});

像这样:
Meteor.publish("amenities", function (latlng) {
   return Amenities.find({
      location: {
        $near: {
          $geometry: {
            type: "Point",
            coordinates: latlng
          },
          $maxDistance: 20000   //meters
        }
      }
    });
});

您必须具有正确的数据类型和索引。和字段location(-:

关于mongodb - 移动 meteor 应用程序-计算附近的位置并存储为可排序的集合,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23490264/

10-10 08:51
查看更多