当前位置: 首页 > 工具软件 > bbs-go > 使用案例 >

golang mongo-go-driver find() 默认读取101条记录的解决办法

左丘弘致
2023-12-01

想直接看答案的可以看我在论坛的提问和回答(https://bbs.csdn.net/topics/399169646)。

下面是一些过程,最后还有一个疑问,请各位帮忙解答。

最近需要使用 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条呢?

 

 类似资料: