我无法使用猫鼬的qry.where().near()
语法查询mongodb数据库。
我有一个架构,其坐标存储为数组,索引为2dsphere
:
loc : { type: [Number], index: '2dsphere' }
我正在使用运行猫鼬查询.where().near()
:
qry.where('loc').near({
center: search.loc,
maxDistance: search.distance * 1000
});
我已启用mongoose.set('debug', true)
,并且可以看到生成的调试信息:
[ 10, -20 ]
: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 } })
查询不返回 结果。
我通过搜索证明了文档已在数据库中type
。它是我无法使用的地理空间查询。
我正在使用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
对象而不是坐标对,例如:
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 });
问题内容: 我有一个猫鼬的架构和模型,定义如下: 如果我尝试: 我收到错误消息: 尽管不需要此架构中的location字段,但无论如何它似乎都在起作用。我尝试添加可以避免此错误的方法,但是似乎有点hack,因为这显然不是一个很好的默认值,理想情况下,该架构不需要用户始终有位置。 MongoDB / mongoose的地理空间索引是否暗示需要建立索引的字段? 问题答案: 默认情况下,声明为数组的属性
问题内容: 我需要在node.js中用猫鼬返回查询的结果。 如何返回值以将值设置为变量? 我需要做的是: 为了有: 非常感谢您的回复 。 我还有另一个问题。 如何使用find或findOne在查询运算符中传递变量?喜欢 : 问题答案: 有几种方法可以实现您想要的。 1.使用猫鼬查询 在这种策略中,您的函数返回一个Mongoose查询,您以后可以使用它来调用该方法并使用它来获取结果。 然后,您可以简
本文向大家介绍如何在MongoDB未索引字段上有效运行复杂查询?,包括了如何在MongoDB未索引字段上有效运行复杂查询?的使用技巧和注意事项,需要的朋友参考一下 创建索引以有效运行复杂的查询。首先让我们创建一个包含文档的集合- 在方法的帮助下显示集合中的所有文档- 这将产生以下输出- 以下是在未索引字段上有效执行复杂查询的查询- 这将产生以下输出-
问题内容: 在Node.js中使用Mongoose,您可以使用find返回一些字段。例如。 但我似乎无法弄清楚如何使用findOneAndUpdate返回某些字段。 有人做到过吗?我在文档中找不到它。 问题答案: 从说明书,该参数需要一个关键的它,因为还有其他的细节,比如和地方适用。您 还 需要以下选项: 您也可以使用 请注意,没有返回的文档处于处理更新修改 之前 的状态。有时候这就是您的意思,但
问题内容: 我有一个使用名为Todo的模型的路由设置,如下所示: 但是,todos.length始终为0,因为它找不到任何结果。当我跑步时: 我确定我已连接到同一数据库。我可以在mongod控制台中看到连接。我的连接位于config / db.js文件中: 我的server.js中的连接如下: 在Mongo Shell中,我得到1个结果。我期望此结果将由find查询返回。有什么我想念的吗?我正在使
问题内容: 关于stackoverflow的这个主题似乎有很多问题,但是我似乎在任何地方都找不到确切的答案。 我有的: 我有Company和Person模型: 我需要的: 查找姓氏为“ Robertson”的人已创建的所有公司 我试过的 然后我发现Person不是嵌入式的,而是被引用的,所以我使用populate来填充Founder- Person,然后尝试使用带有’Robertson’姓氏的fi