Details
-
Bug
-
Resolution: Works as Designed
-
Major - P3
-
None
-
0.3.0
-
None
-
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
Description
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.
Attachments
Issue Links
- is duplicated by
-
GODRIVER-876 findOne can fail to return
-
- Closed
-