如何在Google数据存储区中更新实体的特定字段

时间:2019-11-29 19:58:39

标签: go key google-cloud-datastore entity

我具有以下结构:

@Converter(autoApply = true)
public class CurrencyConverter implements AttributeConverter<Currency, String> {

    @Override
    public String convertToDatabaseColumn(Currency currency) {
        return currency.getCurrencyCode();
    }

    @Override
    public Currency convertToEntityAttribute(String currencyCode) {
        return Currency.getInstance(currencyCode);
    }
}

在google数据存储区中,我存储如下:

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

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

Name/ID:
id=5101067637358592 

Name:
Sandy

Phone:
9275939377

Address:
24, Nehru road, Chennai

但是为此,我需要此键 5101067637358592 。现在,如果我知道姓名,地址和旧电话号码,有什么办法可以获取密钥/ ID?

或者如果还有其他方法可以做到,请告诉我。

2 个答案:

答案 0 :(得分:0)

如果您想在不知道实体键的情况下查询实体,则需要能够通过被索引实体的其他字段构造查询。为了唯一地标识一个实体,您将需要一个返回单个实体的查询。通常使用逻辑唯一键字段完成此操作。例如,用户的电子邮件可以是这样的字段。

答案 1 :(得分:0)

来自标准Task类

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

然后,使用事务将实体更新到数据存储。 来自documentation

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

All the code from Google golang samples for GCP