我使用Mongoose执行地理多边形搜索,如下所示:
Location.find({
"location.coordinates": {
"$geoWithin": {
"$geometry": {
"type": "Polygon",
"coordinates": [
coords
]
}
}
}
}, cb);
这将返回一组记录,例如:
{
"_id": "544be0763cea87660ee9c989",
"rating": 5,
"__v": 0,
"create_date": "2014-10-25T17:40:06.167Z",
"location": {
"coordinates": [
-122.41941550000001,
37.7749295
],
"type": [
"Point"
]
}
},
{
"_id": "544be0763cea87660ee9c989",
"rating": 7,
"__v": 0,
"create_date": "2014-09-27T01:40:10.283Z",
"location": {
"coordinates": [
-122.41941550000001,
37.7749295
],
"type": [
"Point"
]
}
}
我还需要计算"等级"的平均值。属性。我知道Mongo有一个聚合框架,但我不确定这是否可以作为初始搜索的一部分,或作为辅助查询,或者查看后处理结果。
有人可以提供建议吗?
更新:要清楚,我想返回当前结果集,并尽可能返回整个结果集的平均评分。
答案 0 :(得分:0)
您正在使用您正在使用的查询语法在服务器上使用MongoDB 2.6或更高版本。这基本上形成了您的答案,因为在此版本中,查询引擎已统一,以便GeoSpatial查询在与其他查询相同的空间中运行。
这意味着聚合框架也可以使用完全相同的查询,因为它本身使用常规查询:
Location.aggregate(
[
// Perform query
{ "$match": {
"location.coordinates": {
"$geoWithin": {
"$geometry": {
"type": "Polygon",
"coordinates": [
coords
]
}
}
}
}},
// Get average from results
{ "$group": {
"_id": null,
"avgRating": { "$avg": "$rating" }
}}
],
function(err,results) {
}
);
大多数地理空间查询都需要成为第一个管道阶段,实际上有一个与$geoNear
建立距离的特殊阶段。但我认为$geoWithin
在以后的流水线阶段很好,但在使用索引的情况下当然是最优的。这意味着仅在第一阶段。