登录
首页 >  Golang >  Go问答

在Go语言中如何过滤和更新Mongo数据库中的数组元素

来源:stackoverflow

时间:2024-02-17 12:33:24 226浏览 收藏

积累知识,胜过积蓄金银!毕竟在Golang开发的过程中,会遇到各种各样的问题,往往都是一些细节知识点还没有掌握好而导致的,因此基础知识点的积累是很重要的。下面本文《在Go语言中如何过滤和更新Mongo数据库中的数组元素》,就带大家讲解一下知识点,若是你对本文感兴趣,或者是想搞懂其中某个知识点,就请你继续往下看吧~

问题内容

我将更新数组的现有元素,而不仅仅是覆盖所有元素。假设它有一个收集设备名称和令牌的用户列表。 例如:

{
"id": some_generated_id,
"uid": some_uuid,
"tokens": [
   {
     "devicename": "web",
     "token": "your first web token"
   },
   {
     "devicename": "android",
     "token": "your first android token"
   }
]
}

在这里,我在 mongodb shell 上完成了它,它的工作原理正是我想要的。

db.users.updateone(
{},
{ $set: { "tokens.$[elem].devicename" : "web", "tokens.$[elem].token" : "your web's updated token" } },
{ arrayfilters: [ { "elem.devicename": { $eq: "web" } } ] }
)

仅更新网络令牌。 但在 go 语言中,它不会更新确切的元素,而是覆盖整个数组。

这是我用 go 语言所做的。

col := n.mongo.Database("fcm_db").Collection("users")
    filter := bson.M{"uuid": user.UUID}
    arrayFilters := options.ArrayFilters{
        //Filters: []interface{}{bson.M{"x.deviceName": user.Tokens[0].DeviceName}},
        Filters: bson.A{bson.M{"x.deviceName": bson.M{"$eq": user.Tokens[0].DeviceName}}},
    }
    update := bson.M{
        "$set": bson.M{
            "tokens.$[x].deviceName": user.Tokens[0].DeviceName,
            "tokens.$[x].token":      user.Tokens[0].Token,
        },
    }
    opts := options.UpdateOptions{
        ArrayFilters: &arrayFilters,
        //Upsert:       &upsert,
    }

    ret, err := col.UpdateOne(context.Background(), filter, update, &opts)
    if err != nil {
        n.logger.Error(err.Error())
        return err
    }
    fmt.Printf("result UpsertedCount %v", ret.UpsertedCount)
    fmt.Printf("result ModifiedCount %v", ret.ModifiedCount)

正确答案


mongodb 更新:

53861957188​​2

go 语言代码:

filter := bson.D{{}}
update := bson.D{{ "$set", bson.D{{ "tokens.$[e].token", "updated value" }}}}
arrayFiltersOpt := options.ArrayFilters{ Filters: []interface{}{ bson.D{{ "e.deviceName", "web" }} }}
opts := options.Update().SetArrayFilters(arrayFiltersOpt)

updateResult, err := collection.UpdateOne(context.TODO(), filter, update, opts)

今天关于《在Go语言中如何过滤和更新Mongo数据库中的数组元素》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于的内容请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>