如何使用golang删除MongoDB数组中的第N个元素



我需要删除expenses中的第一个或第二个元素

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

Smth样expenses[0].Delete()

结果应该是这样的:

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

您必须使用$unsetupdate命令,并手动提及数组关键字名称及其索引。

更新命令:

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

全通码

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

最新更新