在LoopbackJs的属性GeoPoint上添加Mongo GeoJSON 2dsphere索引

时间:2016-10-26 08:26:11

标签: mongodb indexing loopbackjs

正如标题所示,我试图在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

1 个答案:

答案 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"})

但是你可以看到它并没有真正回答这个问题 - 这只是一种解决方法。