代码之家  ›  专栏  ›  技术社区  ›  mosquito87

附近有猫鼬

  •  0
  • mosquito87  · 技术社区  · 9 年前

    我有以下“疑问”:

    MySchema
        .where('address1.loc').near({
            center: {
                type: 'Point',
                coordinates: user.address1.loc
            },
            maxDistance: 10 * 1000
        }).where('address2.loc').near({
            center: {
                type: 'Point',
                coordinates: user.address2.loc
            },
            maxDistance: 10 * 1000
        })
        .exec(function(err, objects) {
            console.log(err);
            console.log(objects);
    
            if(err) return eachCallback(err);
    
            return eachCallback();
        });
    

    我的模式有两个地址(一个拾取地址和一个切换地址)。所以我必须使用两个“近距”。但这似乎不可能:

    { [MongoError: Can't canonicalize query: BadValue Too many geoNear expressions] name: 'MongoError' }

    我的选择是什么?

    更新: 我和MongoDB的一些人谈过。尽管我的用例是有效的,但这似乎不可能开箱即用。所以我在寻找一种“变通方法”。如果您需要有关用例的详细信息,请告诉我。

    下面是我如何定义“地址”中的位置:

    ...
    loc: {type: [Number], index: '2dsphere'},
    ...
    
    1 回复  |  直到 9 年前
        1
  •  3
  •   efkan    9 年前

    我遇到了同样的问题和错误消息。但我记不清我是如何克服的。我希望我们能解决你的问题! 如果您的模式定义如下,请尝试以下解决方案:;

    loc : {
            'type': { type: String, default: 'Point' },
            coordinates: [Number]
        } 
    

    你能检查一下你的收藏中地址.loc.coordinates商店的编号吗?

    备用方式

    尝试使用 $geoWithin 操作人员

    我想你可以像下面这样修改你的提问条款。你应该使用 $地理范围 $centerSphere 而不是 $near $maxDistance 。您已尝试查找 loc 10.000米附近的田地。 $centerSphere 表示 radius ,它使用传统坐标值(仅[经度,纬度]),并且可以与 geoJSON 字段和 2dsphere 指数还有你的 $centerSphere 定义必须为 10/6371 10公里( tutorial ).

    如果使用第二个运算符 美元附近 操作员出现问题 MongoDB side .

    不能将需要特殊地理空间索引的$near运算符与使用不同类型特殊索引的查询运算符或命令组合。例如,不能将$near与$text查询组合。

    var r = 10/6371;
    var area1 = { center: address1.loc.coordinates, radius: r, unique: true }
    var area2 = { center: address2.loc.coordinates, radius: r, unique: true }
    
    MySchema
        .where('address1.loc').
        .within()
        .circle(area1)
        .where('address2.loc').
        .within()
        .circle(area2)
        .exec(function(err, objects) {
            console.log(err);
            console.log(objects);
    
            if(err) return eachCallback(err);
    
            return eachCallback();
        });
    

    希望这有帮助。。