我试图让这段代码工作(node + mongoose)
model.find({
$and: [
{ 'location': { $near: { $geometry: {type: 'Point', coordinates: [lat, long]} }, $maxDistance: 1000 }},
{'status': { $size: 1 }}
]
},
继续
无法找到任何特殊指数:2d(需求指数),2dsphere(需要 index),for:{$ and:[{location:{$ near:{$ geometry:{type: " Point",坐标:[12.5386,41.884]}},$ maxDistance:1000}}, {status:{$ size:1}}]}
我确实使用mongo
建立了索引{
"location" : "2dsphere"
}
我错过了什么?
非常感谢。
编辑:添加文档结构
{
"name" : "Frag",
"desc" : "Frag",
"host" : ObjectId("534047663164711f7e7a952f"),
"_id" : ObjectId("535d7d8b454017f874de2d42"),
"status" : [
{
"state" : "created",
"_id" : ObjectId("535d7d8b454017f874de2d43"),
"date" : ISODate("2014-04-27T21:58:35.406Z")
}
],
"users" : [
ObjectId("534047663164711f7e7a952f")
],
"location" : [
32.0652823,
34.7767135
],
"__v" : 0
}
答案 0 :(得分:1)
你在做错了,因为你正在为实际定义为“遗留坐标对”的东西指定GeoJSON坐标映射,并且两者之间存在很大差异。
当然你应该做什么(我的集合中的数据称为docs):
db.docs.find({
"location": {
"$near": [12.5386, 41.884],
"$maxDistance": 1000
},
"status": { "$size": 1 }
})
但是除非我实际上将索引类型更改为“2d”,否则这是失败的:
db.docs.dropIndexes();
db.docs.ensureIndex({ "location": "2d" })
然后,您可以按照预期获得文档的结果。
这是设计为“2dsphere”索引是为GeoJSON格式的数据而设计的,来自文档:
$near运算符需要地理空间索引:GeoJSON点的2dsphere索引;传统坐标对的2d索引。默认情况下,使用2d索引的查询返回100个文档的限制;但是你可以使用limit()来改变结果的数量。
如果你想要一个“2dsphere”索引,那么你的坐标数据需要改变:
"loc" : {
"type" : "Point",
"coordinates" : [
32.0652823,
34.7767135
]
}
但是直接的“解决方法”显然是使用“2d”索引,当然也会改变你的语法。