记录一次阅读源码的过程。
在使用golang mongo 查询的过程中,使用了sort进行排序,使用了多个字段进行排序。
结果,返回multi-key map passed in for ordered parameter sort 这个错误。
首先上网查了一下这个错误,发现没有人遇到过这样的问题。
查询中,使用了find方法,以及排序,如下图所示。
我看了一下源码。
在源码中找到Find()方法。
定位到Find()方法中,sort参数解析。
从源码看,的确是不支持多个字段排序的。
但是,实际上mongoDB是支持,多个字段排序的。
后来仔细想了一下,知道golang中不支持多个字段排序的原因。map本来就是无序的,如果map中有多个字段也是无序的,所以,就不能支持多字段排序。
//mongo driver source code
//排序操作,multi-key map error问题查找。
//从源码看,不支持多个排序条件
//突然知道为什么不支持多个条件排序了,map本来就是无序的,如果map中有多个字段也是无序的,所以,就不能支持多字段排序
func transformBsoncoreDocument(val interface{}, mapAllowed bool, paramName string) ([]byte, error) {
if val == nil {
return nil, fmt.Errorf("ErrNilDocument")
}
if bs, ok := val.([]byte); ok {
// Slight optimization so we'll just use MarshalBSON and not go through the codec machinery.
val = bson.Raw(bs)
}
if !mapAllowed {
refValue := reflect.ValueOf(val)
if refValue.Kind() == reflect.Map && refValue.Len() > 1 {
fmt.Println("ErrMapForOrderedArgument{paramName}")
return nil, fmt.Errorf("ErrMapForOrderedArgument{paramName}")
}
fmt.Printf("refValue:%+v\n", refValue)
}
// // TODO(skriptble): Use a pool of these instead.
// buf := make([]byte, 0, 256)
// b, err := bson.MarshalAppendWithRegistry(registry, buf[:0], val)
// if err != nil {
// return nil, MarshalError{Value: val, Err: err}
// }
return []byte{}, nil
}
原因找到了,接下来就是寻找替代方案了。