首页 > 解决方案 > 如何在谷歌数据存储中更新实体的特定字段

问题描述

我有以下结构:

type MyEntity struct {
 DSGeneratedID int64 json:"-" datastore:"-"
 Phone string json:"phone"
 Name string json:"name"
 Address string json:"address"
}

在谷歌数据存储中,我存储如下:

Name/ID:
id=5101067637358592 

Name:
Sandy

Phone:
9275939377

Address:
24, Nehru road, Chennai

说,我想更改电话号码的值。现在,如果我知道“key.id”值,我可以使用下面的代码来实现我想要的。

entity := publisher.MyEntity{
   Phone: "9472749280",
   Name: "Sandy",
   Address: "24, Nehru road, Chennai",
}
key := datastore.IDKey("Mine", **5101067637358592**, nil)

client.Put(ctx, key, &entity)

但为此我需要这个密钥5101067637358592。现在,如果我知道姓名、地址和旧电话号码,有没有办法获得钥匙/身份证?

或者如果有任何其他方法可以做到这一点,请告诉我。

标签: gokeygoogle-cloud-datastoreentity

解决方案


从标准任务类

// Task is the model used to store tasks in the datastore.
type Task struct {
        Desc    string    `datastore:"description"`
        Created time.Time `datastore:"created"`
        Done    bool      `datastore:"done"`
        id      int64     // The integer ID used in the datastore.
}

您可以从查询中获取已知字段的键 ID。

var tasks []*Task

query := datastore.NewQuery("Task").Order("created")
keys, err := client.GetAll(ctx, query, &tasks)
if err != nil {
        return nil, err
}

// Set the id field on each Task from the corresponding key.
for i, key := range keys {
        tasks[i].id = key.ID
}

然后,使用事务将实体更新到数据存储区。从文档中。

tx, err := client.NewTransaction(ctx)
if err != nil {
        log.Fatalf("client.NewTransaction: %v", err)
}
var task Task
if err := tx.Get(taskKey, &task); err != nil {
        log.Fatalf("tx.Get: %v", err)
}
task.Priority = 5
if _, err := tx.Put(taskKey, &task); err != nil {
        log.Fatalf("tx.Put: %v", err)
}
if _, err := tx.Commit(); err != nil {
        log.Fatalf("tx.Commit: %v", err)
}

GCP 的 Google golang 示例中的所有代码


推荐阅读