Home > Software design >  How to delete Nth element in MongoDB array with golang?
How to delete Nth element in MongoDB array with golang?

Time:12-01

I need to delete first or second element in expenses

{"_id":{"$oid":"12"},
"chatID":{"$numberInt":"12"},
"expenses":[
   ​{"category":"food","amount":{"$numberDouble":"12.0"}},
   ​{"category":"food","amount":{"$numberDouble":"14.0"}}],
"income":[]}

Smth like expenses[0].Delete()

Result should be like this:

{"_id":{"$oid":"12"},
"chatID":{"$numberInt":"12"},
"expenses":[
   ​{"category":"food","amount":{"$numberDouble":"14.0"}}],
"income":[]}

CodePudding user response:

You have to make use of the $unset update command and manually mention the array key name along with its index.

Update Command:

_, err = collection.UpdateOne(
        ctx,
        bson.D{},  // <- Find Parameter
        bson.D{
            {"$unset", bson.D{
                {"expenses." indexToRemove, 1},  // <- Removes `indexToRemove` th element from `expenses` array
            }},
        },
    )

Full Go Code

package main

import (
    "context"
    "fmt"
    "go.mongodb.org/mongo-driver/bson"
    "go.mongodb.org/mongo-driver/mongo"
    "go.mongodb.org/mongo-driver/mongo/options"
    "time"
)

func main() {
    ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
    defer cancel()
    mClient, err := mongo.Connect(ctx, options.Client().ApplyURI("mongodb://localhost:27017"))

    defer func() {
        if err = mClient.Disconnect(ctx); err != nil {
            panic(err)
        }
    }()

    collection := mClient.Database("temp").Collection("tmp10")

    ctx, cancel = context.WithTimeout(context.Background(), 5*time.Second)
    defer cancel()

    var result bson.M
    err = collection.FindOne(ctx, bson.D{}).Decode(&result)
    fmt.Println(result)

    indexToRemove := "0"  // <- Input index to remove in string or convert it into string

    _, err = collection.UpdateOne(
        ctx,
        bson.D{},
        bson.D{
            {"$unset", bson.D{
                {"expenses." indexToRemove, 1},  // <- Removes `indexToRemove` th element from `expenses` array
            }},
        },
    )
    if err != nil {
        fmt.Println(err)
    }

    err = collection.FindOne(ctx, bson.D{}).Decode(&result)
    fmt.Println(result)
}
  • Related