即使创建了索引,也无法找到$ geoNear查询的索引

时间:2015-06-07 11:36:03

标签: node.js mongodb mongoose

我有以下架构,我在地理坐标上有一个二维索引。

1.5.x

我想找到新的位置:

var mongoose = require("mongoose");
var Schema = mongoose.Schema;

var LocationSchema = new Schema ({
    geo: {
        type: [Number],
        required: true,
        index: "2dsphere"
    }
});

module.exports = mongoose.model("Location", LocationSchema);

似乎创建了索引:

Location.find({
    geo: {
        $nearSphere: [req.query.lat, req.query.lng],
        $maxDistance: maxDistance
    }
}, function(err, events) {
    if (err) {
        console.log(err);
        res.status(500).json(err);
    }
    res.status(200).json(events);
});

虽然我在这里创建索引但是当我想找到附近的位置时会出现以下错误:

> db.system.indexes.find();
{ "v" : 1, "key" : { "geo" : "2dsphere" }, "name" : "geo_2dsphere", "ns" : "dev.events", "background" : true, "safe" : null, "2dsphereIndexVersion" : 2 }

4 个答案:

答案 0 :(得分:6)

来自Mongo Docs Mongo使用[经度,纬度],这里你正在使用反向。

答案 1 :(得分:2)

将解析数据库迁移到AWS后,我遇到了类似的问题。 我通过

解决了这个问题
db.prod.createIndex({ "location": "2d" })

prod是我的收藏名称和位置是存储地理位置的列名称(GeoPoint)

可以在geo location issue(github)

找到相关的讨论& geoNear

答案 2 :(得分:0)

您已在位置架构中定义了“geo”,并且您正在使用

loc : {
         $nearSphere: [req.query.lat, req.query.lng],
         $maxDistance: maxDistance
      }

将其更改为

geo : {
         $nearSphere: [req.query.lat, req.query.lng],
         $maxDistance: maxDistance
      }

答案 3 :(得分:0)

确保查询中的字段名称与架构中的名称匹配。因为我的错误来了,因为我的架构有'loc'而查询正在搜索'lastLocation'。

 var mongoQuery = User.find({
                lastLocation: {
                    $near: coordinates,
                    $maxDistance: maxDistance
                }
            }).limit(limit);

var UserSchema   = new mongoose.Schema({
    //...
    lastLocation: {
        type: [Number],
        index: '2d'
    }
});