起因
今天一位朋友问了我一个问题 他说多字段排序有问题 乱序 而我也是模棱两可 最后自己做了一个测试 记在这里 深化了一下学习成果。
正文
使用排序时不能使用bson.M{}去排序否则排序结果是和预期结果有差异的
原因:底层的结构是Map结构 在golang中map值是无序的 而排序是根据字段值的先后顺序优先级进行排序 所以排序取值的时候就是乱序的 所以会造成乱序




既然是无序的那么我们弄成有序的,恰好jdk已经为我们提供了方法 只需要换成bson.D{}即可, 至于原理底层是切片类型。


总结
bson.M{}进行排序不是不可以使用,在只有一个字段排序的情况下还是能使用的。当大于等于两个字段值以上的时候就会有乱序的问题了,还有在使用bson.M{}的时候对数据的顺序无关紧要的情况下也可以使用, 比如在使用bson.M{}的情况下插入数据对document顺序无关紧要的情况下可以使用。另外在使用多个document构成的复合索引的时候,需要保证索引字段的顺序,不然会造成索引不命中等问题。

一个使用golang的码农...
完~
网友评论