英文:
Golang: how to check if collection.Find didn't find any documents?
问题
我正在使用Go Mongo文档,其中明确写道,使用FindOne函数时,如果没有与筛选条件匹配的文档,将返回ErrNoDocuments错误。然而,如果我使用Find函数并且没有找到文档,该错误不会被返回。有没有一种方法可以检查游标是否为空,而不必获取所有返回的文档列表,然后检查列表是否为空?
英文:
I'm using Go Mongo documentation where it is explicitly written that with FindOne function, if no documents are matching the filter, ErrNoDocuments will be returned, however, this error is not returned if I use Find function and no documents are found. Is there a way to check that the cursor is empty without getting a list of all returned documents and then checking if the list is empty?
答案1
得分: 1
你可以简单地调用Cursor.Next()
来判断是否还有更多的文档。如果你还没有遍历过任何文档,这将告诉你是否至少有一个结果文档。
请注意,这将导致结果的第一批被获取(但不会将任何结果文档解码为Go值)。
还要注意,如果发生错误或传递的context.Context
过期,Cursor.Next()
将返回false
。
示例:
var c *mongo.Collection // 获取集合
curs, err := c.Find(ctx, bson.M{"your-query": "here"})
// 处理错误
hasResults := curs.Next(ctx)
if hasResults {
// 存在结果文档
}
// 不要忘记关闭游标!
不过,如果你打算解码结果,你也可以直接调用Cursor.All()
并检查结果切片的长度:
curs, err := c.Find(ctx, bson.M{"your-query": "here"})
// 处理错误
var results []YourType
err := curs.All(ctx, &results)
// 处理错误
if len(results) > 0 {
// 存在结果
}
// 注意:Cursor.All()会关闭游标
英文:
You may simply call Cursor.Next()
to tell if there are more documents. If you haven't iterated over any yet, this will tell if there's at least one result document.
Note that this will cause the first batch of the results to fetch though (but will not decode any of the result documents into any Go values).
Also note that Cursor.Next()
would return false
if an error would occur or the passed context.Context
would expire.
Example:
var c *mongo.Collection // Acquire collection
curs, err := c.Find(ctx, bson.M{"your-query": "here"})
// handle error
hasResults := curs.Next(ctx)
if hasResults {
// There are result documents
}
// Don't forget to close the cursor!
Although if you intend to decode the results, you might as well just call Cursor.All()
and check the length of the result slice:
curs, err := c.Find(ctx, bson.M{"your-query": "here"})
// handle error
var results []YourType
err := curs.All(ctx, &results)
// Handle error
if len(results) > 0 {
// There are results
}
// Note: Cursor.All() closes the cursor
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论