Javascript 对2dsphere索引字段的Mongoose near(…)查询未返回有效结果
我无法使用mongoose的Javascript 对2dsphere索引字段的Mongoose near(…)查询未返回有效结果,javascript,node.js,mongodb,mongoose,Javascript,Node.js,Mongodb,Mongoose,我无法使用mongoose的qry.where().near()语法查询mongodb数据库 我有一个模式,其坐标存储为数组,索引为2dsphere: loc : { type: [Number], index: '2dsphere' } 我正在使用.where().near()运行mongoose查询: 我已经启用了mongoose.set('debug',true),并且可以看到结果调试: 在集合中插入两个坐标为[10,-20]的文档: 在坐标附近搜索文档[10,-20]: 查询不返回任何
qry.where().near()语法查询mongodb数据库
我有一个模式,其坐标存储为数组,索引为2dsphere
:
loc : { type: [Number], index: '2dsphere' }
我正在使用.where().near()
运行mongoose查询:
我已经启用了mongoose.set('debug',true)
,并且可以看到结果调试:
在集合中插入两个坐标为[10,-20]
的文档:
在坐标附近搜索文档[10,-20]
:
查询不返回任何结果。
通过搜索类型
,我已证明文档在数据库中。这是地理空间查询,我无法工作
我正在使用mongodb v2.6.1
和mongoose v3.8.8
完整的工作示例如下:
模式:(model.js)
摩卡咖啡测试:(test.ts)
package.json:
通过摩卡咖啡:
似乎这是一只月鹅虫
将查询更改为使用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 });
如果索引是2dsphere,则必须使用GeoJSON表示法;如果索引是2d,则需要使用坐标对。您@Steve是救生员!我如何显示确切的距离?示例:user.distance=2230米。可以近距离订购吗?@IgorMartins你找到答案了吗?
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
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 });