Google Datastore 插入/更新查询中如何使用长 ID?

Posted

技术标签:

【中文标题】Google Datastore 插入/更新查询中如何使用长 ID?【英文标题】:How are Long ids used in Google Datastore insert/update queries? 【发布时间】:2017-10-11 08:21:46 【问题描述】:

我们的产品使用 Google Datastore 作为应用程序数据库。大多数实体使用 Long 类型的 ID 和一些 String 类型的 ID。我注意到 Long 类型的 ID 不是连续的。

现在我们将一些包含大约 30 到 4000 万个条目的大表导出到 json 文件以用于某些业务目的。最初,我们期望像“ofy().load().type(ENTITY.class).startAt(cursor).limit(BATCH_LIMIT).iterator()”这样的简单查询将帮助我们遍历该特定表的全部内容,从第一个条目开始,到最近创建的条目结束。我们是分批工作的,每批后都存储光标,以便下一个任务可以加载该批并继续。

但是在注意到几分钟前创建的实体的 ID 可能小于 1 周前创建的另一个实体的 ID 之后,我们想知道是否应该考虑在此导出期间冻结内容。一方面,重要的是要进行良好的导出并且不要错过特定日期之前的旧数据,另一方面,超过 1 天的内容冻结对我们的客户来说是一个问题。

您建议我们做什么?

谢谢, 克里斯蒂安。

【问题讨论】:

为每个实体添加时间戳怎么样?也许一个用于创建,一个用于更新 某些实体设置了创建日期,因此我们将在查询中使用它,它应该会有所帮助。但其他人不... 【参考方案1】:

我认为您不必担心您的身份的唯一性。数据存储基于 Bigtable 构建,包含 6 个表。

    第一个表存储实体 按种类存储实体 第三个按升序存储属性值的索引 第四个按降序存储属性值的索引 fifth 将多个属性的索引存储在一起 sixth 跟踪 Kind 的下一个唯一 ID

格式是这样的。 [应用程序 ID]-[命名空间]-[种类]-[ID]

这是每个实体唯一性的保证。

是的,该表的格式是 [Application ID]-[Kind Name],值是下一个值。假设您有同类产品,该表将如下所示 |key(yourapp-products), Next ID(3)|。现在您为种类产品创建了新实体,它将分配给 ID(3),并且该表上的行将获得新值 |key(yourapp-products),下一个 ID(4)|。还要提到该表只有一行,因为我们只有一种产品。

您是自己指定 ID 还是让数据存储区自行生成?听起来您有“预分配 ID”问题,只是推测,但对于每个批次,您都需要对 Kind.allocate_ids(size=blah) 进行排序,这样您就可以保持顺序。

【讨论】:

感谢您的回答,它带来了很多新信息。有一件事,你确定第六个会跟踪下一个唯一 ID 吗?我之所以问,是因为我认为与表中已经存在的条目相比,我看到了 ID 值较小的条目。 评论似乎太长了。我添加到答案中。 我们没有使用 DatastoreService.allocateIds 功能,所以这可能是我看到没有增量分配的 ID 的原因。 看起来像。

以上是关于Google Datastore 插入/更新查询中如何使用长 ID?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Google Cloud Datastore 上更新交易中的帐户余额

如何汇总来自 Google Datastore 查询结果的属性列表?

Google Cloud Datastore 过滤包含列表中项目的数据

PHP DataStore 地理查询

使用 gcloud 连接到 Google Datastore

Google Datastore 部分字符串匹配