在猫鼬中创建和查找地理位置
Create & Find GeoLocation in mongoose
我正在尝试在我的用户模型中保存位置的 longitude/latitude 并使用 $geoNear
查询它。我已经查看了几乎所有我能找到的有关该主题的页面,但我仍然不确定如何 1) 适当地创建模型以及如何查询它。
这是我模型的一部分:
loc: {
//type: 'Point', // see 1
//type: String, // see 2
coordinates: [Number],
index: '2dsphere' // see 3
},
@1:根据文档,如果我想存储一个点,类型必须是 'Point',但它会抛出
TypeError: Undefined type `Point` at `loc`
Did you try nesting Schemas? You can only nest using refs or arrays.
这是有道理的,因为我猜它应该是 String
@2:这不会立即引发错误,但是当我尝试存储用户时,我得到:
name: 'ValidationError',
errors:
{ loc:
{ [CastError: Cast to String failed for value "[object Object]" at path "loc"]
@3:如果我想创建这样的索引,我会收到错误消息:
TypeError: Undefined type `2dsphere` at `loc.index`
Did you try nesting Schemas? You can only nest using refs or arrays.
所以我尝试将索引存储到我觉得更合适的地方,如下所示:
userSchema.index({'loc': '2dsphere'});
当我尝试保存新用户时抛出以下错误:
- { [MongoError: Can't extract geo keys from object, malformed geometry?:{ coordinates: [ -73.97, 40.77 ] }]
name: 'MongoError',
message: 'Can\'t extract geo keys from object, malformed geometry?:{ coordinates: [ -73.97, 40.77 ] }',
ok: 1,
n: 0,
code: 16572,
errmsg: 'Can\'t extract geo keys from object, malformed geometry?:{ coordinates: [ -73.97, 40.77 ] }',
writeConcernError:
{ code: 16572,
errmsg: 'Can\'t extract geo keys from object, malformed geometry?:{ coordinates: [ -73.97, 40.77 ] }' } }
MongoError: Can't extract geo keys from object, malformed geometry?:{ coordinates: [ -73.97, 40.77 ] }
当我将数据库中的模型更新为 $geoNear
命令时,我像这样更新了我的用户:
loc: {coordinates: [-73.97, 40.77]}
并且可以像这样成功查询:
mongoose.model('users').db.db.command({
"geoNear": users,
"near": [
<latitude>,
<longitude>
],
"spherical": true,
"distanceMultiplier": 6378.1, // multiplier for kilometres
"maxDistance": 100 / 6378.1, // every user within 100 km
"query": { }
(我使用了 db.command,因为据我所知,使用 find()
时 $geoNear
不可用)
到目前为止我所做的一切都无济于事,所以我现在的问题是:
- 我的猫鼬模型应该是什么样的?
- 如何在我的数据库中存储用户及其位置
如有任何帮助,我们将不胜感激!
如果你想要一个支持 GeoJSON 的模式,你首先需要正确地构造它:
var userSchema = new Schema({
loc: {
type: { type: String },
coordinates: [Number],
}
});
这确保不会与架构定义的 "type" 关键字混淆。如果你真的想支持整个范围的 GeoJSON 类型,那么你可以放宽一点:
var userSchema = new Schema({
loc: {
type: { type: String },
coordinates: []
}
});
接下来您要将索引绑定到 shema:
userSchema.index({ "loc": "2dsphere" });
然后当然是定义模型并正确存储东西:
var User = mongoose.model( "User", userSchema );
var user = new User({
"loc": {
"type": "Point",
"coordinates": [-73.97, 40.77]
}
});
请注意,您的数据必须按 经度 然后按 纬度 顺序,由 GeoJSON 和所有 MongoDB 地理空间查询表单支持.
接下来,不要直接在原始驱动程序方法上深入研究数据库命令的模糊用法,而是使用直接支持的东西,并且更好。如$geoNear
为.aggregate()
方法:
User.aggregate(
[
{ "$geoNear": {
"near": {
"type": "Point",
"coordinates": [<long>,<lat>]
},
"distanceField": "distance",
"spherical": true,
"maxDistance": 10000
}}
],
function(err,results) {
}
)
现在因为数据是 GeoJSON,距离已经转换为米,所以不需要做其他转换工作。
另请注意,您一直在搞乱这个问题,除非您删除集合,否则您尝试的任何索引仍会存在,这可能会导致问题。
您可以轻松地从 mongodb shell 中的集合中删除所有索引:
db.users.dropIndexes();
或者因为您可能需要重新调整一些数据,然后删除集合并重新开始:
db.users.drop();
正确设置,你不会有任何问题。
这对我来说是点和多边形的更好解决方案。
var WeSchema = new Schema({
Location: {
type: {
type: String,
enum: ['Point', 'Polygon']
},
coordinates: [Number]
}
});
WeSchema.index({Location: '2dsphere' });
我正在尝试在我的用户模型中保存位置的 longitude/latitude 并使用 $geoNear
查询它。我已经查看了几乎所有我能找到的有关该主题的页面,但我仍然不确定如何 1) 适当地创建模型以及如何查询它。
这是我模型的一部分:
loc: {
//type: 'Point', // see 1
//type: String, // see 2
coordinates: [Number],
index: '2dsphere' // see 3
},
@1:根据文档,如果我想存储一个点,类型必须是 'Point',但它会抛出
TypeError: Undefined type `Point` at `loc`
Did you try nesting Schemas? You can only nest using refs or arrays.
这是有道理的,因为我猜它应该是 String
@2:这不会立即引发错误,但是当我尝试存储用户时,我得到:
name: 'ValidationError',
errors:
{ loc:
{ [CastError: Cast to String failed for value "[object Object]" at path "loc"]
@3:如果我想创建这样的索引,我会收到错误消息:
TypeError: Undefined type `2dsphere` at `loc.index`
Did you try nesting Schemas? You can only nest using refs or arrays.
所以我尝试将索引存储到我觉得更合适的地方,如下所示:
userSchema.index({'loc': '2dsphere'});
当我尝试保存新用户时抛出以下错误:
- { [MongoError: Can't extract geo keys from object, malformed geometry?:{ coordinates: [ -73.97, 40.77 ] }]
name: 'MongoError',
message: 'Can\'t extract geo keys from object, malformed geometry?:{ coordinates: [ -73.97, 40.77 ] }',
ok: 1,
n: 0,
code: 16572,
errmsg: 'Can\'t extract geo keys from object, malformed geometry?:{ coordinates: [ -73.97, 40.77 ] }',
writeConcernError:
{ code: 16572,
errmsg: 'Can\'t extract geo keys from object, malformed geometry?:{ coordinates: [ -73.97, 40.77 ] }' } }
MongoError: Can't extract geo keys from object, malformed geometry?:{ coordinates: [ -73.97, 40.77 ] }
当我将数据库中的模型更新为 $geoNear
命令时,我像这样更新了我的用户:
loc: {coordinates: [-73.97, 40.77]}
并且可以像这样成功查询:
mongoose.model('users').db.db.command({
"geoNear": users,
"near": [
<latitude>,
<longitude>
],
"spherical": true,
"distanceMultiplier": 6378.1, // multiplier for kilometres
"maxDistance": 100 / 6378.1, // every user within 100 km
"query": { }
(我使用了 db.command,因为据我所知,使用 find()
时 $geoNear
不可用)
到目前为止我所做的一切都无济于事,所以我现在的问题是:
- 我的猫鼬模型应该是什么样的?
- 如何在我的数据库中存储用户及其位置
如有任何帮助,我们将不胜感激!
如果你想要一个支持 GeoJSON 的模式,你首先需要正确地构造它:
var userSchema = new Schema({
loc: {
type: { type: String },
coordinates: [Number],
}
});
这确保不会与架构定义的 "type" 关键字混淆。如果你真的想支持整个范围的 GeoJSON 类型,那么你可以放宽一点:
var userSchema = new Schema({
loc: {
type: { type: String },
coordinates: []
}
});
接下来您要将索引绑定到 shema:
userSchema.index({ "loc": "2dsphere" });
然后当然是定义模型并正确存储东西:
var User = mongoose.model( "User", userSchema );
var user = new User({
"loc": {
"type": "Point",
"coordinates": [-73.97, 40.77]
}
});
请注意,您的数据必须按 经度 然后按 纬度 顺序,由 GeoJSON 和所有 MongoDB 地理空间查询表单支持.
接下来,不要直接在原始驱动程序方法上深入研究数据库命令的模糊用法,而是使用直接支持的东西,并且更好。如$geoNear
为.aggregate()
方法:
User.aggregate(
[
{ "$geoNear": {
"near": {
"type": "Point",
"coordinates": [<long>,<lat>]
},
"distanceField": "distance",
"spherical": true,
"maxDistance": 10000
}}
],
function(err,results) {
}
)
现在因为数据是 GeoJSON,距离已经转换为米,所以不需要做其他转换工作。
另请注意,您一直在搞乱这个问题,除非您删除集合,否则您尝试的任何索引仍会存在,这可能会导致问题。
您可以轻松地从 mongodb shell 中的集合中删除所有索引:
db.users.dropIndexes();
或者因为您可能需要重新调整一些数据,然后删除集合并重新开始:
db.users.drop();
正确设置,你不会有任何问题。
这对我来说是点和多边形的更好解决方案。
var WeSchema = new Schema({
Location: {
type: {
type: String,
enum: ['Point', 'Polygon']
},
coordinates: [Number]
}
});
WeSchema.index({Location: '2dsphere' });