2017-03-06 73 views
1

我無法理解如何正確使用$字面值。我正在使用mgo.v2和mgo.v2/bson軟件包。

db.store.aggregate([ 
{"$project":{ 
    "location":{ 
     "type":{"$literal":"Point"}, 
     "coordinates":["$longitude","$latitude"] 
    }} 
},]) 

我使用上述代碼獲取MongoDB中數據和工作fine.It給我的結果

{ "location":{ 
      "type":"Point", 
      "coordinates":[77.587073,12.958794] 
     }} 

我試圖使用相同的在golang和它下面示出

pipe :=DB.C("store").Pipe([]bson.M{ 
     {"$project":bson.M{"location": 
     bson.M{"type": 
     bson.M{"$literal":"Point"},"coordinates":[]interface{}{"$longitude","$latitude"}}}}} 

上面的代碼,我拋出一個錯誤

恐慌:壞查詢:BADVALUE:點必須是一個數組或對象

,所以我代替它像這樣

pipe :=DB.C("store").Pipe([]bson.M{ 
     {"$project":bson.M{"location": 
     bson.M{"$literal": 
     bson.M{"type":"Point"},"coordinates":[]interface{}{"$longitude","$latitude"}}}}}) 

但是這也引發了我一個錯誤

恐慌:此對象已經是一個運算符表達式,並且不能被 用作文檔表達式(在「座標」處)

我的完整工作顯示在下面的鏈接 my work is here 請幫我解決這個問題。 謝謝

+0

你能展示更多的代碼嗎,因爲你的第一個版本適合我? – icza

+0

我按照你的要求添加了我的作品。我在將代碼從MongoDB查詢轉換爲Golang時遇到問題。 –

回答

0

是完整的,這是你真正努力去做:

pipe := DB.C("store").Pipe([]bson.M{ 
    {"$project": bson.M{"location": bson.M{"type": bson.M{"$literal": "Point"}, "coordinates": []interface{}{"$longitude", "$latitude"}}}}, 
    {"$match": bson.M{"location": bson.M{"$geoWithin": bson.M{"$centerSphere": []interface{}{"$coordinates", 10/6378.11}}}}}, 
}) 

問題不在於你"Point"文字,它只是一個偶然的巧合。例如,如果將其更改爲"Pt",則仍會看到完全相同的錯誤消息。

錯誤消息中的Point指的是$centerSphere,其預計中心和半徑。而你試圖「通過」它的方式不起作用。

這適用於例如:

"$centerSphere": []interface{}{[]interface{}{1.0, 2.0}, 10/6378.11} 

原始查詢是沒有意義的,因爲你試圖找到文件,其中位置是從本身,這將匹配所有文獻10公里的範圍內。

相反,你要/應該查詢哪些是特定地點10公里範圍內的文檔,你可以通過這個特定位置的座標$centerSphere

myLong, myLat := 10.0, 20.0 

// ... 

"$centerSphere": []interface{}{[]interface{}{myLong, myLat}, 10/6378.11} 

完整的查詢:

myLong, myLat := 10.0, 20.0 
pipe := DB.C("store").Pipe([]bson.M{ 
    {"$project": bson.M{"location": bson.M{"type": bson.M{"$literal": "Point"}, "coordinates": []interface{}{"$longitude", "$latitude"}}}}, 
    {"$match": bson.M{"location.coordinates": bson.M{"$geoWithin": bson.M{"$centerSphere": []interface{}{[]interface{}{myLong, myLat}, 10/6378.11}}}}}, 
}) 
+0

非常感謝,它工作正常。感謝您澄清關於中心球體的「點」。我可以看到,您將「location」更改爲「location.coordinates」,我將其用作完全錯誤的$座標。 –

+0

「位置」或「location.coordinates」正常工作。我沒有發現任何差異,但問題是「$座標」,我應該使用lat和long。謝謝。 –

+0

@hariprasad是的,我測試過了,兩者都可以正常工作,但是我覺得指定''location.coordinates''更合適。 – icza