正如标题所示,我试图在LoopbackJs上的GeoPoints属性上添加一个2dsphere索引。 我的MongoDB shell版本是3.2.3 - 所以应该这样做。
到目前为止,这是我的尝试:
在我的server / datasource.js中添加enableGeoIndexing
{
...
"myDs": {
"host": "localhost",
"port": 27017,
"database": "myDB",
"name": "myDs",
"connector": "mongodb",
"enableGeoIndexing": true
}
... }
似乎没有任何改变。
以Loopback方式添加索引+具有自动更新脚本:
{
"name": "NsUser",
"base": "User",
"idInjection": true,
"options": {
"validateUpsert": true
},
"indexes": {
"geopoint_index": {
"geopoint": "2dsphere"
}
},
"properties": {
"created": {
"type": "date"
},
"firstname": {
"type": "string"
},
"lastname": {
"type": "string"
},
"geopoint": {
"type": "geopoint"
},
...
}
…
}
我收到了一个错误:
"ok" : 0,
"errmsg" : "Can't extract geo keys: { _id: ObjectId('5807689f01723b3ca6ba08e5'), created: new Date(1426545369000), email: \"xxx@gmail.com\", firstname: \"Louis\", lastname: \"L\", geopoint: { lat: -17.52243049, lng: -149.54396636 } } can't project geometry into spherical CRS: { lat: -17.52243049, lng: -149.54396636 }",
"code" : 16755
答案 0 :(得分:4)
我发现添加2dsphere索引的唯一解决方案是添加一个新属性geopoint_mongo
,这是一个数组[lng, lat]
。
这是我用来转换数据的脚本:
NsUser.createMongoGeoloc = function (cb) {
NsUser.find(function (err, users) {
var count = 0;
users.forEach(function (user) {
var change = false;
if (user.geopoint && user.geopoint.lat && user.geopoint.lng) {
count++;
user.geopoint_mongo = [user.geopoint.lng, user.geopoint.lat];
change = true;
}
if (change) {
NsUser.upsert(user);
}
});
cb(err, count);
});
};
NsUser.remoteMethod(
'createMongoGeoloc',
{
description: 'Update the Geolocation for NsUser',
returns: {arg: 'count', type: 'number'},
http: {verb: 'put'}
}
);
然后添加mongo索引就可以了:
db.NsUser.createIndex({geopoint_mongo:"2dsphere"})
但是你可以看到它并没有真正回答这个问题 - 这只是一种解决方法。