多个附近有猫鼬

时间:2015-02-25 15:38:52

标签: node.js mongodb mongoose

我有以下"查询":

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 个答案:

答案 0 :(得分:3)

我遇到了同样的问题和错误消息。但我不记得到底是怎么克服的。我希望我们能克服你的问题! 如果您的架构定义如下,请尝试以下解决方案;

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

你可以在你的收藏品上查看address.loc.coordinates商店作为号码吗?

替代方式

尝试使用$geoWithin运算符

我认为你可以改变你的提问条款,如下所示。您应该使用$geoWithin$centerSphere代替$near$maxDistance。您已尝试查找距离10.000米处有loc个字段的记录。 $centerSphere表示radius,它使用传统坐标值(仅[经度,纬度]),并且可以与geoJSON字段和2dsphere索引一起使用。您的$centerSphere定义必须为10/6371 10公里。 (tutorial)。

如果您使用$near运算符的第二个运算符,则会在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();
    });

希望这会有所帮助..