kleinph
kleinph

Reputation: 181

geospatial queries on subdocuments

I have a mongoose schema with subdocuments that contain a location field (with 2dSpehre index). Like this:

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' }
        }
    ],
});

When I try to query for addresses via geospatial operators I get this error: planner returned error: unable to find index for $geoNear query. The query looks like this:

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

I also checked via mongo that the index really exists:

> 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
    }
]

What am I doing wrong? Thanks in advance.

Upvotes: 3

Views: 592

Answers (1)

Justin Case
Justin Case

Reputation: 1513

Are you sure you are using the right collection? Mongoose will pluralize your collection name by default (so players instead of player).

The script below is working for me. For some reason Mongoose wasn't creating the 2dsphere index for me when it was specified in the schema so I moved that out.

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)
});

Upvotes: 3

Related Questions