Mangouste près de(...) la requête sur 2dsphere champ indexé à ne pas renvoyer des résultats valides

Je suis incapable d'interroger une base de données mongodb à l'aide de la mangouste est qry.where().near() syntaxe.

J'ai un Schéma dont les coordonnées sont stockées dans un tableau, indexés comme 2dsphere:

loc : { type: [Number], index: '2dsphere' }

Je suis en cours d'exécution une mangouste requête à l'aide de .where().near():

qry.where('loc').near({
    center: search.loc,
    maxDistance: search.distance * 1000
});

J'ai activé mongoose.set('debug', true), et peut voir la debug:

De l'insertion de 2 documents dans la collection, avec les coordonnées [ 10, -20 ]:

Mongoose: models.insert({ _id: ..., loc: [ 10, -20 ], type: 'apple' }) {}  
Mongoose: models.insert({ _id: ..., loc: [ 10, -20 ], type: 'orange' }) {}  

À la recherche de documents près de coordonnées [ 10, -20 ]:

Mongoose: models.find({ loc: { '$near': [ 10, -20 ], '$maxDistance': 1000 } })

La requête retourne pas de résultats.

J'ai prouvé que les documents sont dans la base de données en effectuant une recherche sur type. Son géospatiales requête je ne peux pas me rendre au travail.

Je suis en utilisant mongodb v2.6.1 et mongoose v3.8.8

De travail complète, l'exemple ci-dessous:

Schéma: (model.js)

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

var ModelSchema = new Schema({
    type : { type: String, index: true },
    loc  : { type: [Number], index: '2dsphere' }
});

ModelSchema.index({type: 1, loc: 1});

ModelSchema.statics.search = function(search, cb) {
    var qry = this.find();
    if (search.types) {
        qry.where('type').in(search.types);
    }
    if (search.loc) {
        qry.where('loc').near({
            center: search.loc,
            maxDistance: search.distance * 1000
        });
    }
    qry.exec(cb);
};

Moka test: (test.ts)

var q = require('node-promise'),
should = require('should'),
mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/my-test');
var Model = require('./model');
describe('My Model', function() {
before(function(done) {
mongoose.set('debug', true);
Model.remove().exec(function() {
var create = function(promises, body) {
var p = new q.Promise();
var m = new Model(body);
m.save(function(err) {
if (err) {
console.log(err);
p.reject();
} else {
p.resolve();
}
});
promises.push(p);
};
var promises = [];
create(promises, { type: 'apple',  loc: [ 10, -20 ] });
create(promises, { type: 'orange', loc: [ 10, -20 ] });
create(promises, { type: 'apple',  loc: [ 15,  10 ] });
create(promises, { type: 'orange', loc: [ 15,  10 ] });
q.all(promises).then(function() {
done();
})
});
});
it('should find all', function(done) {
Model.search({}, function(err, items) {
items.should.have.length(4);
done();
});
});
it('should find apples', function(done) {
Model.search({types: ['apple']}, function(err, items) {
items.should.have.length(2);
done();
});
});
//this test fails
it('should find coords', function(done) {
Model.search({loc: [ 10, -20 ], distance: 1}, function(err, items) {
items.should.have.length(2);
done();
});
});
});

paquet.json:

{
"name": "test",
"version": "0.0.0",
"dependencies": {
"mongoose": "~3.8.8"
},
"devDependencies": {
"should": "~2.1.0",
"node-promise": "0.5.10"
}
}

Courir à travers moka:

sudo npm install -g mocha
npm install
mocha ./test.js

OriginalL'auteur Steve Lorimer | 2014-05-30