【问题标题】:How to update an entity's particular field in google datastore如何在谷歌数据存储中更新实体的特定字段
【发布时间】:2019-12-02 21:58:59
【问题描述】:

我有以下结构:

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

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

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。现在,如果我知道姓名、地址和旧电话号码,有什么办法可以得到钥匙/身份证?

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

【问题讨论】:

    标签: go key google-cloud-datastore entity


    【解决方案1】:

    来自标准任务类

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 我能够构造一个查询并获取一个实体并获取该实体的所有其他字段,但“id.key”除外,因为当我获取它时,它是“0”所以要么 1)我怎样才能得到“id.key”? (或)2)我能够获得实体的所有其他字段,而不是“id.key”。现在,我如何更新该实体的这些字段之一?
      • Get/GetAll 和 Next API 返回密钥。您还可以实现 KeyLoader 接口 (godoc.org/cloud.google.com/go/…) 以将密钥自动填充到您的实体中。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-14
      • 1970-01-01
      相关资源
      最近更新 更多