我要来是因为我需要了解几何计算,但是,这是行不通的。我目前正在使用globalsign/mgo
软件包
从文档中我们可以得到:
db.<collection>.find( { <location field> :
{ $near :
{ $geometry :
{ type : "Point" ,
coordinates : [ <longitude> , <latitude> ] } ,
$maxDistance : <distance in meters>,
}
}
}
)
查询2dsphere索引:https://docs.mongodb.com/manual/tutorial/query-a-2dsphere-index/2dsphere索引:https://docs.mongodb.com/manual/core/2dsphere/
所以我有以下几点:
import (
"github.com/globalsign/mgo/bson"
"shared/models"
"time"
)
type Address struct {
ID *bson.ObjectId `protobuf:"bytes,1,opt,name=id,proto3" json:"_id,omitempty" bson:"_id"`
IsArchived bool `protobuf:"varint,2,opt,name=IsArchived,proto3" json:"is_archived,omitempty" bson:"is_archived"`
CreatedAt time.Time `protobuf:"varint,3,opt,name=CreatedAt,proto3" json:"created_at,omitempty" bson:"created_at"`
UpdatedAt time.Time `protobuf:"varint,4,opt,name=UpdatedAt,proto3" json:"update_at,omitempty" bson:"updated_at"`
PlaceID *bson.ObjectId `protobuf:"bytes,5,opt,name=PlaceID,proto3" json:"place_id,omitempty" bson:"place_id"`
CountryCode string `protobuf:"bytes,6,opt,name=CountryCode,proto3" json:"country_code,omitempty" bson:"country_code,omitempty"`
AdministrativeArea string `protobuf:"bytes,7,opt,name=AdministrativeArea,proto3" json:"administrative_area,omitempty" bson:"administrative_area,omitempty"`
Locality string `protobuf:"bytes,8,opt,name=Locality,proto3" json:"locality,omitempty" bson:"locality,omitempty"`
PostalCode string `protobuf:"bytes,9,opt,name=PostalCode,proto3" json:"postal_code,omitempty" bson:"postal_code,omitempty"`
Thoroughfare string `protobuf:"bytes,10,opt,name=Thoroughfare,proto3" json:"thoroughfare,omitempty" bson:"thoroughfare,omitempty"`
Premise string `protobuf:"bytes,11,opt,name=Premise,proto3" json:"premise,omitempty" bson:"premise,omitempty"`
Location GeoJson `protobuf:"bytes,12,opt,name=Location,proto3" json:"location,omitempty" bson:"location,omitempty"`
}
type GeoJson struct {
Type string `json:"-"`
Coordinates []float64 `json:"coordinates"`
}
var addresses []*models.Address
collection := _session.DB(constants.DBName).C(documentName)
err := collection.Find(session, addressDocument, bson.M{
"location": bson.M{
"$near": bson.M{
"$geometry": bson.M{
"type": "Point",
"coordinates": []float64{ -115.172813, 36.101379 },
},
"$maxDistance": 5000000,
},
},
}) &addresses)
由此,我得到以下错误:“错误处理查询:ns = DBNAME.addressDocumentTree:GEONEAR字段=位置maxdist = 5e + 06 isNearSphere = 0 \ nSort:{} \ nProj:{} \ n计划者返回了错误:无法为$ geoNear查询找到索引”
我确保在程序初始化时索引
// EnsureIndex
func EnsureAddressIndex(session *mgo.Session) error {
_session := session.Copy()
defer _session.Close()
c := _session.DB(constants.DBName).C(addressDocument)
// Might be needed one day
pIndex := mgo.Index{
Key: []string{"location:2dsphere"},
Bits: 26,
}
err := c.EnsureIndex(pIndex)
if err != nil {
return err
}
return nil
}
任何的想法?我有超过2万个地址,而且都包含经/纬度。编辑1
我试图从
globalsign/mgo
切换到gopkg.in/mgo.v2
没有成功 最佳答案
终于找到了问题。.实际上,我没有以正确的方式创建索引。
// EnsureIndex force ids to be unique
func EnsureAddressIndex(session *mgo.Session) error {
_session := session.Copy()
defer _session.Close()
c := _session.DB(constants.DBName).C(addressDocument)
// Might be needed one day
pIndex := mgo.Index{
Key: []string{"$2dsphere:location"},
Bits: 26,
}
err := c.EnsureIndex(pIndex)
if err != nil {
return err
}
return nil
}
在索引声明中,我有以下内容:
pIndex := mgo.Index{
Key: []string{"location:2dsphere"},
Bits: 26,
}
但是正确的写法是
pIndex := mgo.Index{
Key: []string{"$2dsphere:location"},
Bits: 26,
}
希望能帮助到你 !
关于mongodb - 无法按2sphere查找元素,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54727125/