对于Meteor中的出版物中的位置使用ensureIndex

时间:2015-05-24 17:21:49

标签: javascript mongodb meteor geospatial

我目前正在尝试仅提取用户附近的集合。我已经能够在客户端成功地使用我的其他一些系列来完成这项工作,但我很难在出版物中完成它。

我的server/index.js中有以下代码:

Events._ensureIndex({'loc.coordinates':'2dsphere'});

以下server/publications.js

Meteor.publish('allEventsNearMe', function() {
  if (!this.userId) return null;
  var user = Meteor.users.findOne(this.userId);
  var home = Homes.findOne(user.profile.homeId);
  return Events.find({
    loc: {
      $near: {
        $geometry: {
          type: "Point",
          coordinates: home.loc.coordinates // this is an array ex. [-80, 25]
        },
        $maxDistance:32187
      }
    }
  });
});

当我尝试订阅此出版物时,出现以下错误:

  

sub allEventsNearMe id的异常BDspYdPy6BG4RTP42错误:   轮询查询时出现异常   { “集合名”: “事件”, “选择”:{ “LOC”:{ “$近”:{ “$几何”:{ “类型”: “点”, “坐标”: - 80.26824199999999,26.123774]} “$ maxDistance”:32187}}}, “选项”:{ “改造”:空}}:   无法执行查询:错误处理查询:ns = meteor.events

     

limit = 0 skip = 0 planner返回错误:无法找到索引   $ geoNear查询

我尝试在Meteor.startup中包装Events._ensureIndex,但这也没有用。有什么想法吗?

2 个答案:

答案 0 :(得分:2)

我有类似的问题。在shell中创建索引并没有解决部署中的问题。只有在我创建了一个模式并将其附加到集合后(使用简单模式和集合2),我才成功在js文件中使用db._ensure Index并且它工作正常。

答案 1 :(得分:1)

尝试删除当前索引和 create the 2dsphere index ,将位置字段指定为键而不是坐标数组。

要首先删除索引并保留您的数据,您可以通过在应用程序的根目录中键入以下内容连接到mongo shell(当流星 正在运行时):

$ meteor mongo

进入shell后,可以使用以下命令删除索引:

> db.events.dropIndex({'loc.coordinates':1});

要在文档的“loc”字段中创建“2dsphere”索引,请尝试

> db.events.ensureIndex({'loc':'2dsphere'});