$并与mongo / mongoose中的2dsphere结合使用

时间:2014-05-25 09:11:22

标签: node.js mongodb mongoose

我试图让这段代码工作(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
}

1 个答案:

答案 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”索引,当然也会改变你的语法。