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)
}