Golang:如何检查collection.Find是否没有找到任何文档?

问题描述 投票:0回答:2

我正在使用Go Mongo文档,其中明确写道,使用FindOne函数,如果没有文档与过滤器匹配,将返回ErrNoDocuments,但是,如果我使用Find函数并且没有找到文档,则不会返回此错误。有没有一种方法可以检查光标是否为空,而无需获取所有返回文档的列表,然后检查列表是否为空?

mongodb go mongo-go
2个回答
1
投票

您只需致电

Cursor.Next()
询问是否还有更多文件。如果您还没有迭代过任何一个,这将告诉您是否至少有一个结果文档。

请注意,这将导致获取第一批结果(但不会将任何结果文档解码为任何 Go 值)。

另请注意,如果发生错误或传递的

Cursor.Next()
 将过期,false
 将返回 
context.Context

示例:

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!

虽然如果您打算解码结果,您不妨调用

Cursor.All()
并检查结果切片的长度:

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

0
投票

您可以检查错误类型

import "go.mongodb.org/mongo-driver/mongo"

...
err = collection.FindOne(ctx, filter).Decode(&result)
if err == mongo.ErrNoDocuments {
    // Do something when no record was found
    fmt.Println("record does not exist")
} else if err != nil {
    log.Fatal(err)
}
// other code
...
© www.soinside.com 2019 - 2024. All rights reserved.