我无法使用猫鼬的qry.where().near()语法查询mongodb数据库。
qry.where().near()
我有一个架构,其坐标存储为数组,索引为2dsphere:
2dsphere
loc : { type: [Number], index: '2dsphere' }
我正在使用运行猫鼬查询.where().near():
.where().near()
qry.where('loc').near({ center: search.loc, maxDistance: search.distance * 1000 });
我已启用mongoose.set('debug', true),并且可以看到生成的调试信息:
mongoose.set('debug', true)
[ 10, -20 ]
Mongoose: models.insert({ _id: ..., loc: [ 10, -20 ], type: 'apple' }) {} Mongoose: models.insert({ _id: ..., loc: [ 10, -20 ], type: 'orange' }) {}
Mongoose: models.find({ loc: { '$near': [ 10, -20 ], '$maxDistance': 1000 } })
查询不返回 结果。
我通过搜索证明了文档已在数据库中type。它是我无法使用的地理空间查询。
type
我正在使用mongodb v2.6.1和mongoose v3.8.8
mongodb v2.6.1
mongoose v3.8.8
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); };
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(); }); }); });
{ "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
看来这是个 月球虫 。
将查询更改为 使用GeoJSON对象而不是坐标对,例如:
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 }
现在搜索成功。
该文档使用坐标对显式显示查询:
query.where('loc').near({ center: [10, 10], maxDistance: 5 });
但是,这似乎不起作用,示例应为:
query.where('loc').near({ center: { coordinates: [10, 10], type: 'Point' }, maxDistance: 5 });