完全を期すために、これはあなたが実際にやろうとしていることです:
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"
に変更した場合 たとえば、まったく同じエラーメッセージが表示されます。
ポイント
エラーメッセージでは、 $centerSphere<を参照しています。 / code>
、中心ポイントを期待します と半径。そして、それを「通過」させようとする方法は機能しません。
これは次のように機能します:
"$centerSphere": []interface{}{[]interface{}{1.0, 2.0}, 10 / 6378.11}
場所がそれ自体から10km以内にあるドキュメントを検索しようとするため、元のクエリは意味がありません。 、これはすべてのドキュメントに一致します。
代わりに、特定のから10km以内にあるドキュメントをクエリする必要があります。 場所。この特定の場所の座標を$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}}}}},
})