一尘不染

Google数据存储中的唯一电子邮件

go

我有一个User包含Email字段的实体。该User实体ID是ULID,因为我想允许用户更改他们的电子邮件地址,但我想确保电子邮件地址是两个独特的CREATEUPDATE

我正在使用数据存储区交易。这是一个代码片段:

ctx := context.Background()
k := datastore.NameKey("User", user.ID, nil)
_, err := client.RunInTransaction(ctx, func(t *datastore.Transaction) error {
    // other stuff that needs to be in transaction
    _, err = t.Put(k, user)
    return err
})

return err

Email字段已建立索引。User作为交易的一部分,有什么方法可以在实体中搜索当前用户的电子邮件地址?

*datastore.Transaction没有GetAll方法,所以我无法运行这样的查询:

datastore.NewQuery("User").Filter("Email =", user.Email)

恐怕使用

client.GetAll(ctx, q, nil)

不能保证交易内的隔离。


阅读 176

收藏
2020-07-02

共1个答案

一尘不染

简短的回答是“否”,除非您要查询特定的实体组,否则您不能将查询用作事务的一部分。全局查询始终总是一致的。但是,将所有内容放在单个实体组中可能会极大地限制写入吞吐量。

解决方法是您可以使用另一种带有将电子邮件地址映射到用户的实体的实体。然后,您可以在事务中检查电子邮件实体,如果它不存在或指向错误的位置,则将电子邮件实体和用户实体都设置为单个事务。

2020-07-02