如何从数据存储中获取 name/key

how to fetch name/key in from datastore

找不到任何现有的 Go 具体答案,因此创建一个新答案。

我们的数据存储包括以下内容columns/attributes

Name/ID Email UserID UserName

现在,我想将这些值检索到我的 Go 结构中。这是我写的

type UserDetails struct {
    NameID    string
    Email     string `datastore:"Email"`
    UserID    string `datastore:"UserID"`
    UserName  string `datastore:UserName`
}

现在,当我获取这个实体(基于种类)时,我手动设置 NameID

func (c DataStoreClient) GetUserDetailsByOrg(ctx context.Context, orgName string) ([]*UserDetails, error) {
    var userDetails []*UserDetails
    q := datastore.NewQuery(userDetailsKind).
        Namespace(orgName)
    keys, err := c.client.GetAll(ctx, q, &userDetails)
    for i, key := range keys {
        userDetails[i].NameID = key.Name
    }
    return userDetails, err
}

现在,我想问的问题是,这是检索 Name/ID 的正确方法,还是我可以通过在结构中指定 datastore:Name/ID 来检索它?

你的方法很好。但是,因为您的 NameID 没有任何标记,所以将有一个数据存储实体 属性,该名称设置为空。这是一个不必要的 属性 存储。因此,您可以将其设为 "NameID string datastore:"-" so datastore ignores it. Alternatively, if you are not exporting this field outside the package or via JSON, you can use a lower case name like "nameID".

另一种方法是通过“key”字段自动获取整个密钥。您可以在关键字段中了解更多信息

https://godoc.org/cloud.google.com/go/datastore#hdr-Key_Field

实现 KeyLoader 接口以在实体加载期间设置字段。

type UserDetails struct {
    NameID   string `datastore:"-"`
    Email    string `datastore:"Email"`
    UserID   string `datastore:"UserID"`
    UserName string `datastore:UserName`
}

func (ud *UserDetails) LoadKey(k *datastore.Key) error {
    ud.NameID = k.Name
    return nil
}

func (ud *UserDetails) Load(ps []datastore.Property) error {
    return datastore.LoadStruct(ud, ps)
}

func (ud *UserDetails) Save() ([]datastore.Property, error) {
    return datastore.SaveStruct(ud)
}

这样使用:

func (c DataStoreClient) GetUserDetailsByOrg(ctx context.Context, orgName string) ([]*UserDetails, error) {
    var userDetails []*UserDetails
    q := datastore.NewQuery(userDetailsKind).
        Namespace(orgName)
    _, err := c.client.GetAll(ctx, q, &userDetails)
    return userDetails, err
}

问题中的方法有效。 KeyLoader 实现的优点是它可以在应用程序查询或获取实体的任何地方节省几行代码。

将 NameID 数据存储名称设置为“-”,以便 属性 加载程序和保存程序忽略该字段。