我有以下"查询":
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'},
...
答案 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();
});
希望这会有所帮助..