附近藉此查詢:
{ 'location' : { '$near' : [x,y], '$maxDistance' : this.field } }
我想要分配$ maxDistance指定字段從目前的評估文件的價值。那可能嗎?
附近藉此查詢:
{ 'location' : { '$near' : [x,y], '$maxDistance' : this.field } }
我想要分配$ maxDistance指定字段從目前的評估文件的價值。那可能嗎?
是的,這是可能的。您只需使用$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"
)
)
);
}
}
);
它的工作原理,謝謝。但我現在有另一個問題,因爲我使用Spring Data Mongodb框架,這仍然不支持$ redact https://jira.spring.io/browse/DATAMONGO-931 :( – anat0lius
@LiLou_它可能沒有「helper」方法,但是你總是可以使用DBObject輸入實現你自己的管道階段作爲抽象,在這個網站上有幾個關於這個問題的答案,我知道自從我寫了幾個這樣的文章。 –
@LiLou_添加了Spring Data Mongo翻譯並且在這個問題中包含了標籤,正如你所看到的,添加自定義流水線階段和語句非常簡單。 –
不,那是不可能的。 –
你不是第一個這個問題:) https://stackoverflow.com/questions/39970436/mongo-geowithin-query-using-sphere-radius-from-the-current-document –
@SergioTulentsev然後你是閱讀錯誤的帖子。已經有一段時間了。你只是做不同的事情。 –