|
| 1 | +# Frequently Encountered Issues |
| 2 | + |
| 3 | +## `WriteXXX` can only write while positioned on a Element or Value but is positioned on a TopLevel |
| 4 | + |
| 5 | +The [`bson.Marshal`](https://pkg.go.dev/go.mongodb.org/mongo-driver/bson#Marshal) function requires a parameter that can be decoded into a BSON Document, i.e. a [`primitive.D`](https://github.com/mongodb/mongo-go-driver/blob/master/bson/bson.go#L31). Therefore the error message |
| 6 | + |
| 7 | +> `WriteXXX` can only write while positioned on a Element or Value but is positioned on a TopLevel |
| 8 | +
|
| 9 | +occurs when the input to `bson.Marshal` is something *other* than a BSON Document. Examples of this occurrence include |
| 10 | + |
| 11 | +- `WriteString`: the input into `bson.Marshal` is a string |
| 12 | +- `WriteNull`: the input into `bson.Marshal` is null |
| 13 | +- `WriteInt32`: the input into `bson.Marshal` is an integer |
| 14 | + |
| 15 | +Many CRUD operations in the Go Driver use `bson.Marshal` under the hood, so it's possible to encounter this particular error without directly attempting to encode data. For example, when using a sort on [`FindOneAndUpdate`](https://pkg.go.dev/go.mongodb.org/mongo-driver/mongo#Collection.FindOneAndUpdate) this error can occur when not properly initializing the `sort` variable: |
| 16 | + |
| 17 | +```go |
| 18 | +var sort bson.D // this is nil and will result in a WriteNull error |
| 19 | +opts := options.FindOneAndUpdate().SetSort(sort) |
| 20 | +update := bson.D{{"$inc", bson.D{{"x", 1}}}} |
| 21 | +sr := coll.FindOneAndUpdate(ctx, bson.D{}, update) |
| 22 | +if err := sr.Err(); err != nil { |
| 23 | + log.Fatalf("error getting single result: %v", err) |
| 24 | +} |
| 25 | +``` |
| 26 | + |
| 27 | +The above example is resolved by initializing the `sort` variable: |
| 28 | + |
| 29 | +```go |
| 30 | +sort := bson.D{} |
| 31 | +``` |
| 32 | + |
| 33 | +## Convert BSON Document to JSON |
| 34 | + |
| 35 | +There are a variety of marshalers that can be used to encode a BSON document as JSON, including [MarshalExtJSON](https://pkg.go.dev/github.com/mongodb/mongo-go-driver/bson#MarshalExtJSON): |
| 36 | + |
| 37 | +```go |
| 38 | +doc := bson.D{{"x", 1}} |
| 39 | + |
| 40 | +jsonBytes, err := bson.MarshalExtJSON(doc, true, false) |
| 41 | +if err != nil { |
| 42 | + log.Fatalf("error encoding json: %v", err) |
| 43 | +} |
| 44 | + |
| 45 | +m := make(map[string]interface{}) |
| 46 | +if err := json.Unmarshal(jsonBytes, &m); err != nil { |
| 47 | + log.Fatalf("error decoding json: %v", err) |
| 48 | +} |
| 49 | +fmt.Printf("json: %v\n", m) |
| 50 | +``` |
| 51 | + |
| 52 | + |
0 commit comments