0

我使用的貓鼬如下執行地理多邊形搜索:的Node.js,MongoDB的 - 貓鼬 - 計算平均值作爲GEO搜索的一部分

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有一個聚合框架,但我不確定這是否可以作爲初始搜索的一部分完成,或作爲輔助查詢,或者查看後處理結果。

任何人都可以建議嗎?


UPDATE:要清楚,我想返回當前的結果集,平均等級設置,如果可能的整個結果。

回答

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在稍後的流水線階段很好,但當然可以使用索引的最佳選擇。這意味着僅在第一階段。

+0

Neil,這確實非常有幫助,並感謝對流水線階段的額外評論。我在問題中沒有說清楚的一件事是,我想要返回當前記錄以及平均評分,也許作爲JSON的父節點。我怎樣才能返回? – Ben 2014-11-06 03:58:58

+0

@Ben這是一個多次被問及的問題。你真的不應該。你可以把所有的東西都推到一個數組中,但是除非你知道你總是處理小的結果,否則這通常是不實際的。這可能會意外地導致16MB BSON限制很快被破壞。一般建議是如果需要並行運行兩個查詢。 – 2014-11-06 04:10:51

+0

@Neil_Lunn - 明白。再次感謝您提供的信息。 – Ben 2014-11-06 04:18:11