当前位置: 首页 > 面试题库 >

在2dsphere索引字段上的猫鼬near(…)查询未返回有效结果

柴凌
2023-03-14
问题内容

我无法使用猫鼬的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),并且可以看到生成的调试信息:

在集合中插入2个坐标为的文档[ 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.1mongoose 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 }

现在搜索成功。

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

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