如何正确使用MongoDB中的$ geoIntersects?

时间:2015-01-07 13:40:36

标签: node.js mongodb mongoose geospatial mongodb-query

我想使用$ geoIntersects来检查一个点是否在多边形中。

我已将here中的英国地区保存在我的mongo数据库中。  我用mongoose-geojson-schema模块保存了所有geoJSON实体。

这是mongoose中定义的模式

var geozoneSchema = mongoose.model('Geozone', {
    geoFeature:  GeoJSON.Feature,
    average:    {type: Number, default: null},
    updated_at: {type: Date, default: Date.now}
});

我写了这个查询,但它没有用。

Geozone.findOne({
    "geometry.coordinates": {
        "$geoIntersects": {
            "$geometry": {
                "type": "Point",
                "coordinates": fakeUser.loc
            }
        }
    }
}, function(err, foundGeozone) {
    if (err) throw err;
    console.log('found geozone: ', foundGeozone);
    if (foundGeozone) {
        console.log('found geozone! Good! Save User.');
    }
});

在fakeUser.loc中存储了这一点

 user.loc = [-3.2, 54.5]; //real loc

所以我确信这一点确实存在于特定存储区域内,但变量foundGeozone为null。

也许,我的查询错了或其他。你能帮帮我吗?

2 个答案:

答案 0 :(得分:0)

根据https://github.com/glynnbird/ukcountiesgeojson中的数据架构,您要搜索的位置字段应为" geometry",而不是" geometry.coordinates":

Geozone.findOne({
    "geometry": {
        "$geoIntersects": {
            "$geometry": {
                "type": "Point",
                "coordinates": fakeUser.loc
            }
        }
    }
}, function(err, foundGeozone) {
    if (err) throw err;
    console.log('found geozone: ', foundGeozone);
    if (foundGeozone) {
        console.log('found geozone! Good! Save User.');
    }
});

答案 1 :(得分:0)

在Victor的案例中,位置字段应为'geoFeature.geometry'

Geozone.findOne({ 'geoFeature.geometry':  
    {$geoIntersects:
      {$geometry:{ "type" : "Point",
        "coordinates" : [longitude, latitude] } //fakeUser.loc
      }
    }
})