下面是一些过程,最后还有一个疑问,请各位帮忙解答。
最近需要使用 golang 操作 mongodb,看到github 上面有两个驱动包:
github.com/mongodb/mongo-go-driver
gopkg.in/mgo.v2
最后选择了mongo-go-driver,目前是2021年4月27日,最近的一次更新是8小时前。而 gopkg.in/mgo.v2 已经2年没更新了,不敢试。
然后在使用的时候就发现,使用 find 函数读取数据时,只能读取101条文档。像下面这样:
cursor, err := video_collection.Find(context.Background(), filter)
然后百度了一下,发现可以用 SetBatchSize 设置默认文档读取大小,像下面这样:
max_record := int32(40000)
cursor, err := video_collection.Find(context.Background(), filter, options.Find().SetBatchSize(max_record))
由于我现在记录有3万多条,所以BatchSize设置成4万。程序可以正常运行,但是仍然不方便。以后如果记录超过4万条,就又要重新编译。
百度了半天也没有找到解决办法,去论坛提问,只有一个人回复,最后也是我自己解决了。
通过仔细查看 https://github.com/mongodb/mongo-go-driver/blob/master/mongo/options/findoptions.go 发现:
// The maximum number of documents to return. The default value is 0, which means that all documents matching the // filter will be returned. A negative limit specifies that the resulting documents should be returned in a single // batch. The default value is 0. Limit *int64
// SetLimit sets the value for the Limit field.
func (f *FindOptions) SetLimit(i int64) *FindOptions {
f.Limit = &i
return f
}
可以通过 SetLimit 设置 Limit 的值 ,默认是0,返回所有符合筛选条件的文档。于是我改成这样:
cursor, err := video_collection.Find(context.Background(), filter, options.Find().SetLimit(0))
测试运行正常无问题。
就有一点没有想通,源文件findoptions.go注释里写的Limit默认值为0,返回所有符合筛选条件的文档。 理论上我没有设置时候就应该返回所有文档,为什么返回的是101条呢?