Mongoose接近(…)查询2dsphere索引字段不返回有效的结果

我无法使用qry.where().near()qry.where().near()语法来查询mongodb数据库。

我有一个坐标存储为一个数组,索引为2dsphere

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

我使用.where().near()运行mongoose查询:

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

我已经启用了mongoose.set('debug', true) ,并可以看到结果debugging:

在坐标为[ 10, -20 ]的集合中插入2个文档:

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

在坐标[ 10, -20 ]附近search文档:

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

该查询返回没有结果。

我已经通过searchtypecertificate文档在数据库中。 它的地理空间查询我无法工作。

我使用的是mongodb v2.6.1 mongoose v3.8.8mongoose v3.8.8

下面的完整工作示例:

架构:( 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); }; 

摩卡testing:(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(); }); }); }); 

的package.json:

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

贯穿摩卡:

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

       

网上收集的解决方案 "Mongoose接近(…)查询2dsphere索引字段不返回有效的结果"

似乎这是一个moongoose错误

将查询更改为使用GeoJSON对象而不是坐标对 ,如下所示:

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

导致以下查询:

 Mongoose: models.find({ loc: { '$near': { '$maxDistance': 1, '$geometry': { type: 'Point', coordinates: [ 10, -20 ] } } } }) { fields: undefined } 

search现在成功。

文档显式使用坐标对显示一个查询:

 query.where('loc').near({ center: [10, 10], maxDistance: 5 }); 

但是,看起来这不起作用,例子应该是:

 query.where('loc').near({ center: { coordinates: [10, 10], type: 'Point' }, maxDistance: 5 });