子文档上的地理空间查询

时间:2014-07-17 22:55:22

标签: node.js mongodb mongoose

我有一个mongoose模式,其子文档包含一个位置字段(带有2dSpehre索引)。像这样:

var playerSchema = new mongoose.Schema({
    name: { type: String, required: true },
    addresses: [
        {
            address: {
                street: String,
                city: String,
                zip: String,
                country: String
            },
            loc: { type: [Number], index: '2dSphere' }
        }
    ],
});

当我尝试通过地理空间运算符查询地址时,出现此错误:planner returned error: unable to find index for $geoNear query。查询如下所示:

var query = {
    'addresses.loc': {
        $nearSphere: {
            $geometry: { type: 'Point', coordinates: [16.3738189, 48.2081743] }
        }
    }
};
Player.find(query).exec();

我还通过mongo检查了索引确实存在:

> db.player.getIndexes()
[
    {
        "v" : 1,
        "key" : {
            "_id" : 1
        },
        "name" : "_id_",
        "ns" : "project.player"
    },
    {
        "v" : 1,
        "key" : {
            "addresses.loc" : "2dsphere"
        },
        "name" : "addresses.loc_2dsphere",
        "ns" : "project.player",
        "2dsphereIndexVersion" : 2
    }
]

我做错了什么?提前谢谢。

1 个答案:

答案 0 :(得分:3)

您确定使用的是正确的收藏品吗?默认情况下,Mongoose会将您的收藏集名称复数化(因此players而不是player)。

以下脚本对我有用。出于某种原因,当在模式中指定时,Mongoose没有为我创建2dsphere索引,因此我将其移出。

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

var playerSchema = new mongoose.Schema({
    name: { type: String, required: true },
    addresses: [
        {
            address: {
                street: String,
                city: String,
                zip: String,
                country: String
            },
            loc: { 'type': { type: String }, 'coordinates': { type: [Number] } }
        }
    ],
});

playerSchema.index({'addresses.loc': '2dsphere'});
var Player = mongoose.model('Player', playerSchema);

mongoose.connect('mongodb://localhost/test');

var query = Player.find({
    'addresses.loc': {
        $nearSphere: {
            $geometry: { type: 'Point', coordinates: [16.3738189, 48.2081743] }
        }
    }
}, function (err, players) {
    console.log(err)
    console.log(players)
});