-
Type:
Bug
-
Resolution: Works as Designed
-
Priority:
Major - P3
-
None
-
Affects Version/s: 0.3.0
-
Component/s: BSON, Core API, Error Handling
-
None
-
Environment:running mongo:3.6-stretch in docker
go version go1.11.5 darwin/amd64
mongo driver github.com/mongodb/mongo-go-driver v0.3.0
-
None
-
None
-
None
-
None
-
None
-
None
-
None
When expecting a single result, and calling FindOne(), an empty SingleResult is sometimes* returned instead - which Decode() handles by returning ErrNoDocuments.
*sometimes seems to be approx. 10% of the time
Find below an example, with steps to reproduce:
Setup collection & insertOne
db.mycollection.insertOne({"name":"some-name", "address": {"first_line":"expected_first_line","second_line":"expected_second_line"}, "age": 10 } )
Structs in code:
type Address struct {
FirstLine string `bson:"first_line"`
SecondLine string `bson:"second_line"`
}
type User struct {
ID primitive.ObjectID `bson:"_id,omitempty"`
Name string `bson:"name"`
Address Address `bson:"address"`
Age int `bson:"age"`
}
Call findOne(), and Decode() in code:
func main() {
mongoClient, err := mongo.NewClient(mongoURI)
if err != nil {
return
}
err = mongoClient.Connect(context.Background())
if err != nil {
return
}
_, err = GetUser(mongoClient)
if err != nil {
if err == mongo.ErrNoDocuments {
fmt.Println(err)
}
}
}
func GetUser(mongoClient *mongo.Client) (*User, error) {
var actualUser User
singleResult := mongoClient.
Database(mongoDB).
Collection(mongoCollection).
FindOne(
context.Background(),
bson.M{
"address": bson.M{
"first_line": expectedFirstLine,
"second_line": expectedSecondLine},
})
if singleResult.Err() != nil {
return nil, singleResult.Err()
}
err := singleResult.Decode(&actualUser)
return &actualUser, err
}
As stated previously, in most cases, this will successfully decode the document into the actualUser struct; however sometimes the decode will instead return an ErrNoDocument.
- is duplicated by
-
GODRIVER-876 findOne can fail to return
-
- Closed
-