我在mongoose版本3.8.3中使用mongoDB $ nearSphere方法来查找附近的位置。
mongoose.models['Event']
.find({ loc :
{
$nearSphere :
{
$geometry : loc,
$maxDistance : 100000
}
}
})
.limit(100)
.exec(function (err, events)
{
console.log(err)
...
}
Events Scheme中的loc字段有一个'2dsphere'索引:
var EventSchema = new Schema
({
...
loc:
{
type: { type: String },
coordinates: { type: [Number], index: '2dsphere' }
},
...
});
变量loc的类型为'Point'。一个例子是:
{ coordinates: [ 12.93598683338508, 48.43299197266921 ], type: 'Point' }
执行上述搜索语句后,我总是收到错误:
2013-12-27T08:46:57.997102+00:00 app[web.1]: { message: 'Cast to number failed for value "Point" at path "__QueryCasting__"',
2013-12-27T08:46:57.997105+00:00 app[web.1]: name: 'CastError',
2013-12-27T08:46:57.997107+00:00 app[web.1]: type: 'number',
2013-12-27T08:46:57.997108+00:00 app[web.1]: value: 'Point',
2013-12-27T08:46:57.997110+00:00 app[web.1]: path: '__QueryCasting__' }
有人可以弄清楚为什么会出现这个错误以及如何解决它?
答案 0 :(得分:1)
这看起来像是Mongoose中的一个错误。我提出了一个问题: https://github.com/LearnBoost/mongoose/issues/1874
我有两个建议的解决方法。
我修改了mongoose / lib / query.js:
} else if (('$near' == geo || '$geoIntersects' == geo) &&
到
} else if (('$near' == geo || '$nearSphere' == geo || '$geoIntersects' == geo) &&
它对我有用(猫鼬3.8.3)。
其次,您可以将查询作为“遗留”坐标对运行(您需要将maxDistance转换为弧度)。 http://docs.mongodb.org/manual/reference/operator/query/nearSphere/
答案 1 :(得分:1)
Mongoose有一个内置的方法,称为near()
,它接受一个GeoJSON Point用于球形地理空间查询。
来自文档:
指定$ near或$ nearSphere条件
所以,而不是:
mongoose.models['Event']
.find({ loc :
{
$nearSphere :
{
$geometry : loc,
$maxDistance : 100000
}
}
}).limit(100).exec(function (err, events) { ... });
试试这个:
mongoose.models['Event']
.near('loc', {
center: loc,
maxDistance : 100000
}).limit(100).exec(function (err, events) { ... });
答案 2 :(得分:0)
这不是真正的mongoose中的错误,你应该在'loc.coordinates'上做find(),而不仅仅是'loc',因为那是2dsphere索引所在的字段。现在,即使mongoose在不失败的情况下强制转换此查询,mongodb服务器也会返回错误,因为您尝试在没有地理索引的字段上运行$ nearSphere。 FWIW 1衬里修复将在mongoose的下一个次要版本中,但您也应该更改您的查询代码。