Google Datastore中的唯一电子邮件

时间:2017-08-22 14:43:21

标签: go transactions google-cloud-datastore

我有一个包含User字段的Email实体。 User实体ID是ULID,因为我想允许用户更改其电子邮件地址,但我希望确保CREATE和{UPDATE上的电子邮件地址都是唯一的{1}}。

我正在使用数据存储区事务。这是一段代码片段:

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)

不保证交易中的隔离。

1 个答案:

答案 0 :(得分:3)

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

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