为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
森栏 2022-10-17 15:43:26
我需要删除第一个或第二个元素expenses{"_id":{"$oid":"12"},"chatID":{"$numberInt":"12"},"expenses":[   {"category":"food","amount":{"$numberDouble":"12.0"}},   {"category":"food","amount":{"$numberDouble":"14.0"}}],"income":[]}喜欢expenses[0].Delete()结果应该是这样的:{"_id":{"$oid":"12"},"chatID":{"$numberInt":"12"},"expenses":[   {"category":"food","amount":{"$numberDouble":"14.0"}}],"income":[]}
查看完整描述

1 回答

?
HUH函数

TA贡献1836条经验 获得超4个赞

您必须使用$unset更新命令并手动提及数组键名及其索引。


更新命令:


_, 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)

}


查看完整回答
反对 回复 2022-10-17
  • 1 回答
  • 0 关注
  • 111 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信