如何在Google Datastore中实现类似Firestore的嵌套层级结构?
Google Datastore 嵌套层级结构实现方案
Datastore 本身不支持直接在kind中嵌套存放kind,但可以通过实体祖先路径的特性,完全模拟出你需要的嵌套层级效果,使用逻辑和Firestore的子集合基本一致。
实现原理
Datastore中每个实体的Key支持包含多级祖先路径,你可以将上一级的实体作为下一级实体的父级,构造出你需要的嵌套结构:
你要实现的层级
kind - entity - kind - entity .... so on
对应到Datastore的Key结构就是:Key(顶层kind, 顶层实体ID/名称, 下一级kind, 下一级实体ID/名称, 再下一级kind, 再下一级实体ID/名称...)
操作示例
构造嵌套实体
以Python的google-cloud-datastore客户端为例,构造三层嵌套结构的代码如下:
from google.cloud import datastore client = datastore.Client() # 1. 创建最上层kind的实体 top_key = client.key("Shop", "shop_001") top_entity = datastore.Entity(key=top_key) top_entity["shop_name"] = "线下门店一号" client.put(top_entity) # 2. 创建上一步实体下嵌套的kind的实体,将父实体Key传入即可 second_key = client.key("Shop", "shop_001", "Order", "order_123") second_entity = datastore.Entity(key=second_key) second_entity["order_amount"] = 299 client.put(second_entity) # 3. 继续向下嵌套多层 third_key = client.key("Shop", "shop_001", "Order", "order_123", "Product", "prod_456") third_entity = datastore.Entity(key=third_key) third_entity["prod_name"] = "纯棉T恤" client.put(third_entity)
查询嵌套层级的实体
如果要查询某个父实体下指定kind的所有实体,直接使用祖先查询即可,等价于Firestore查子集合的操作:
# 查询shop_001下所有的Order实体,等价于Firestore的collection("Shop").doc("shop_001").collection("Order").get() query = client.query(kind="Order", ancestor=top_key) orders = list(query.fetch())
注意事项
- 拥有相同顶层祖先的实体会被划分到同一个实体组,同一个实体组的写入操作有每秒1次的频率限制。如果你的业务写入频率较高,或者不需要跨实体的事务支持,可以不用祖先路径,改用实体属性存储父实体ID的方式关联层级,只是查询的时候需要额外加过滤条件。
内容的提问来源于stack exchange,提问作者Ypsilon Inc
相关产品推荐
相关产品推荐

