0

附近藉此查詢:

{ 'location' : { '$near' : [x,y], '$maxDistance' : this.field } } 

我想要分配$ maxDistance指定字段從目前的評估文件的價值。那可能嗎?

+0

不,那是不可能的。 –

+1

你不是第一個這個問題:) https://stackoverflow.com/questions/39970436/mongo-geowithin-query-using-sphere-radius-from-the-current-document –

+1

@SergioTulentsev然後你是閱讀錯誤的帖子。已經有一段時間了。你只是做不同的事情。 –

回答

3

是的,這是可能的。您只需使用$geoNear。謹防捕獲並仔細閱讀。

假設您的意圖是存儲一個字段,如"travelDistance",以在文檔上指明任何此類搜索必須「在」範圍內,以使距離查詢點的距離有效。然後,我們簡單地查詢與和$redact評估條件:

db.collection.aggregate([ 
    { "$geoNear": { 
    "near": { 
     "type": "Point", 
     "coordinates": [x,y] 
    }, 
    "spherical": true, 
    "distanceField": "distance" 
    }}, 
    { "$redact": { 
    "$cond": { 
     "if": { "$lte": [ "$distance", "$travelDistance" ] }, 
     "then": "$$KEEP", 
     "else": "$$PRUNE" 
    } 
    }} 
]) 

,唯一的缺點是,$geoNear就像$near將只返回一定數量的擺在首位文件「近」。您可以使用選項來調整它,但與常規查詢表單不同,這基本上保證了最終返回的結果將小於指定的「最近」數字。

只要你意識到這一點,那麼這是完全有效的。

這實際上是處理在半徑範圍內「近」的資格的一般方法。

還要根據您如何存儲座標來了解「距離」。作爲傳統座標對,距離將以弧度表示,您可能需要將數學運算轉換爲公里或英里。

如果使用GeoJSON,則距離總是以米爲單位,作爲標準格式。

所有的數學筆記都在文檔中。

N.B仔細閱讀$geoNear文檔。 "2dsphere"索引需要像"spherical"這樣的選項,例如您應該具有真實世界座標。也可能需要應用"limit"以增加默認的100文檔結果,以進一步修剪。


正如註釋提到春天蒙戈,那麼這裏基本上是爲做同樣的事情:

Aggregation aggregation = newAggregation(
    new AggregationOperation() { 
     @Override 
     public DBObject toDBObject(AggregationOperationContext context) { 
     return new BasicDBObject("$geoNear", 
      new BasicDBObject(
      "near", new BasicDBObject(
       "type","Point") 
       .append("coordinates", Arrays.asList(20,30)) 
      ) 
      .append("spherical",true) 
      .append("distanceField","distance") 
     ); 
     } 
    }, 
    new AggregationOperation() { 
     @Override 
     public DBObject toDBObject(AggregationOperationContext context) { 
     return new BasicDBObject("$redact", 
      new BasicDBObject(
      "$cond", Arrays.asList(
       new BasicDBObject("$lte", Arrays.asList("$distance", "$travelDistance")), 
       "$$KEEP", 
       "$$PRUNE" 
      ) 
     ) 
     ); 
    } 
    } 
); 
+0

它的工作原理,謝謝。但我現在有另一個問題,因爲我使用Spring Data Mongodb框架,這仍然不支持$ redact https://jira.spring.io/browse/DATAMONGO-931 :( – anat0lius

+1

@LiLou_它可能沒有「helper」方法,但是你總是可以使用DBObject輸入實現你自己的管道階段作爲抽象,在這個網站上有幾個關於這個問題的答案,我知道自從我寫了幾個這樣的文章。 –

+1

@LiLou_添加了Spring Data Mongo翻譯並且在這個問題中包含了標籤,正如你所看到的,添加自定義流水線階段和語句非常簡單。 –