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
Vous devez vous connecter pour publier un commentaire.
Semble que ce soit une moongoose bug.
Modifiant la requête à utiliser un
GeoJSON
objet au lieu d'une paire de coordonnées, en tant que tel:les résultats de la requête suivante:
Maintenant la recherche réussit.
La docs montrent explicitement une requête à l'aide d'une paire de coordonnées:
Cependant, il semble que ça ne fonctionne pas, et l'exemple doit être:
vous, @Steve, sont épargnant de vie!
Comment puis-je montrer la distance exacte? Exemple: l'utilisateur.distance = 2230 mètres. Est possible de faire une commande de proximité?
OriginalL'auteur Steve Lorimer