javascript – 在2dsphere索引字段上的Mongoose near(…)查询未返回有效结果
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了javascript – 在2dsphere索引字段上的Mongoose near(…)查询未返回有效结果,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3258字,纯文字阅读大概需要5分钟。
内容图文
我无法使用mongoose的qry.where().near()语法查询mongodb数据库.
我有一个Schema,坐标存储为数组,索引为2dsphere:
loc : { type: [Number], index: '2dsphere' }
我正在使用.where().near()运行mongoose查询:
qry.where('loc').near({
center: search.loc,
maxDistance: search.distance * 1000
});
我启用了mongoose.set(‘debug’,true),并且可以看到生成的调试:
在坐标为[10,-20]的集合中插入2个文档:
Mongoose: models.insert({ _id: ..., loc: [ 10, -20 ], type: 'apple' }) {}
Mongoose: models.insert({ _id: ..., loc: [ 10, -20 ], type: 'orange' }) {}
搜索坐标[10,-20]附近的文件:
Mongoose: models.find({ loc: { '$near': [ 10, -20 ], '$maxDistance': 1000 } })
查询不返回任何结果.
我通过搜索类型证明了文档在数据库中.它是我无法工作的地理空间查询.
我使用的是mongodb v2.6.1和mongoose 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);
};
摩卡测试:(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
解决方法:
似乎这是一个猫鼬虫.
更改查询以使用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 }
搜索现在成功了.
docs使用坐标对明确显示查询:
query.where('loc').near({ center: [10, 10], maxDistance: 5 });
但是,看起来这不起作用,示例应该是:
query.where('loc').near({ center: { coordinates: [10, 10], type: 'Point' }, maxDistance: 5 });
内容总结
以上是互联网集市为您收集整理的javascript – 在2dsphere索引字段上的Mongoose near(…)查询未返回有效结果全部内容,希望文章能够帮你解决javascript – 在2dsphere索引字段上的Mongoose near(…)查询未返回有效结果所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。