我目前正在尝试仅提取用户附近的集合。我已经能够在客户端成功地使用我的其他一些系列来完成这项工作,但我很难在出版物中完成它。
我的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,但这也没有用。有什么想法吗?
答案 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'});