【问题标题】:Write entity only if the key isn't present in Google Datastore仅当密钥不存在于 Google Datastore 中时才写入实体
【发布时间】:2021-09-13 12:37:22
【问题描述】:

我要解决的问题是:我有一个每天都会生成实体的服务。其中一些实体是新的,而一些实体在之前的运行中已经被发现。

我需要:

  1. 使数据库保持最新状态,即包含所有已找到的实体
  2. 能够判断何时找到新实体。每个实体都包含一个时间戳,所以如果我可以确保实体没有被覆盖,这应该不会太难(我将在数据库中查询今天找到的实体,这些应该是新的) ,所以这就是我想要做的。

生成的数据是这样的

[
{"key": "a",
"foo": "bar",
"timestamp": "EXMAPLE_TIMESTAMP" },
{"key": "b",
"foo": "baz",
"timestamp": "EXMAPLE_TIMESTAMP" }
] 

注意:实体具有唯一的数据存储键

编辑:我尝试使用Put(),但如果实体的键已经存在,它只会覆盖实体,即使实际内容相同,也会导致时间戳被更新。

【问题讨论】:

  • 你试过什么Go 代码?您遇到的问题似乎是什么?
  • 我尝试使用Put(),但如果实体的键已经存在,它只会覆盖实体,这会导致时间戳被更新,即使实际内容相同@colm.anseo
  • Cerise,我的目标是创建一个不存在的新实体,如果存在则什么也不做。我不想更新现有实体

标签: go google-cloud-platform google-cloud-datastore


【解决方案1】:

仅当密钥不存在时才使用insert mutation 保存实体。

_, err = client.Mutate(ctx, datastore.NewInsert(key, value))
if merr, ok := err.(datastore.MultiError); ok && merr[0] == codes.AlreadyExists {
    err = nil
}
if err != nil {
    // handle error
}

【讨论】:

  • 非常感谢;太棒了!您知道在这种情况下如何计费吗?就像我尝试写一个已经存在的实体一样,这算作文档写吗?
  • @DavidBryant 我不知道,但我猜这是一个小手术。如果答案解决了您的问题,请接受答案。
猜你喜欢
  • 2021-06-29
  • 2013-02-27
  • 2018-01-09
  • 1970-01-01
  • 1970-01-01
  • 2023-04-07
  • 2017-08-04
  • 2018-02-14
  • 2020-04-11
相关资源
最近更新 更多