Datastore 中繼資料

Google Cloud Datastore 提供了程式化的中繼資料存取機制,除了有利於支援元程式設計 (Metaprogramming)、導入後端管理功能之外、它還能提供簡單而一致的快取方式等類似的功能;舉例來說,您可以運用它建構自訂的應用程式資料庫檢視器。可用的中繼資料包括應用程式所用實體群組、命名空間、實體種類及屬性的相關資訊,也包括每項屬性的屬性表示法

GCP 主控台中的 Cloud Datastore 資訊主頁也提供一些與應用程式相關的中繼資料,但就某些重要層面而言,該處顯示的資料不同於這些函式所傳回的資料。

  • 時效性: 使用 API 讀取中繼資料會傳回最新資料,資訊主頁中的資料每天只更新一次。
  • 內容: 無法透過 API 讀取資訊主頁中的某些中繼資料;反之亦然。
  • 速度: 中繼資料取得和查詢作業的計費方式與資料庫取得和查詢作業的計費方式相同。擷取命名空間、種類及屬性相關資訊的中繼資料查詢作業,執行速度通常較慢。根據經驗法則,一項中繼資料查詢傳回 N 個實體所需的時間,大約相當於 N 項一般查詢各自傳回單一實體所需的時間。再者,屬性表示法查詢 (非純金鑰屬性查詢) 的速度比純金鑰屬性查詢慢。中繼資料取得實體群組中繼資料的速度略快於取得一般實體的速度。

中繼資料查詢

中繼資料查詢可使用三種預留的特殊實體種類:

實體 說明
__namespace__ 用於尋找應用程式實體中使用的所有命名空間。
__kind__ 用於查詢特定種類。
__property__ 用於查詢特定屬性類型的中繼資料。

這些種類不會與應用程式中可能已經存在的其他同名種類發生衝突。查詢這些特殊種類即可擷取包含所需中繼資料的實體。

中繼資料查詢傳回的實體是根據 Datastore 現狀而動態產生的。您可以建立 __namespace____kind____property__ 種類的本機實體物件,但無法在 Datastore 中儲存這些物件。

命名空間查詢

您可以使用「命名空間查詢」尋找應用程式實體中使用的所有命名空間。您可以透過這種方式執行活動,例如跨多個命名空間的管理功能。

命名空間查詢會傳回屬於特殊種類 __namespace__ 的實體,其金鑰名稱為命名空間的名稱 (標註空字串 "" 的預設命名空間是例外情形:空字串並非有效的金鑰名稱,因此,這個命名空間的金鑰會改以數字 ID 1 表示)。此類查詢只支援篩選特殊虛擬屬性 __key__,其值即為實體的金鑰。可以按 __key__ 值遞增排序結果 (不能按遞減排序)。__namespace__ 實體沒有屬性,因此,純金鑰查詢和非純金鑰查詢傳回的資訊會是一樣的。

以下範例會傳回應用程式命名空間清單,其範圍介於 startNamespaceendNamespace 變數的指定值之間:

C#

如要瞭解如何安裝及使用 Cloud Datastore 所需的用戶端程式庫,請參閱 Cloud Datastore 用戶端程式庫一文。詳細資訊請參閱 Cloud Datastore C# API 參考說明文件

KeyFactory keyFactory = _db.CreateKeyFactory("__namespace__");
// List all the namespaces between a lower and upper bound.
string lowerBound = _db.NamespaceId.Substring(0,
    _db.NamespaceId.Length - 1);
string upperBound = _db.NamespaceId + "z";
Key startNamespace = keyFactory.CreateKey(lowerBound);
Key endNamespace = keyFactory.CreateKey(upperBound);
Query query = new Query("__namespace__")
{
    Filter = Filter.And(
        Filter.GreaterThan("__key__", startNamespace),
        Filter.LessThan("__key__", endNamespace))
};
var namespaces = new List<string>();
foreach (Entity entity in _db.RunQuery(query).Entities)
{
    namespaces.Add(entity.Key.Path[0].Name);
};

Go

如要瞭解如何安裝及使用 Cloud Datastore 所需的用戶端程式庫,請參閱 Cloud Datastore 用戶端程式庫一文。詳細資訊請參閱 Cloud Datastore Go API 參考說明文件

const (
	startNamespace = "g"
	endNamespace   = "h"
)
query := datastore.NewQuery("__namespace__").
	Filter("__key__ >=", startNamespace).
	Filter("__key__ <", endNamespace).
	KeysOnly()
keys, err := client.GetAll(ctx, query, nil)
if err != nil {
	log.Fatalf("client.GetAll: %v", err)
}

namespaces := make([]string, 0, len(keys))
for _, k := range keys {
	namespaces = append(namespaces, k.Name)
}

Java

如要瞭解如何安裝及使用 Cloud Datastore 所需的用戶端程式庫,請參閱 Cloud Datastore 用戶端程式庫一文。詳細資訊請參閱 Cloud Datastore Java API 參考說明文件

KeyFactory keyFactory = datastore.newKeyFactory().setKind("__namespace__");
Key startNamespace = keyFactory.newKey("g");
Key endNamespace = keyFactory.newKey("h");
Query<Key> query = Query.newKeyQueryBuilder()
    .setKind("__namespace__")
    .setFilter(CompositeFilter.and(
        PropertyFilter.gt("__key__", startNamespace),
        PropertyFilter.lt("__key__", endNamespace)))
    .build();
List<String> namespaces = new ArrayList<>();
QueryResults<Key> results = datastore.run(query);
while (results.hasNext()) {
  namespaces.add(results.next().getName());
}

Node.js

如要瞭解如何安裝及使用 Cloud Datastore 所需的用戶端程式庫,請參閱 Cloud Datastore 用戶端程式庫一文。詳細資訊請參閱 Cloud Datastore Node.js API 參考文件

function runNamespaceQuery(startNamespace, endNamespace) {
  const startKey = datastore.key(['__namespace__', startNamespace]);
  const endKey = datastore.key(['__namespace__', endNamespace]);

  const query = datastore
    .createQuery('__namespace__')
    .select('__key__')
    .filter('__key__', '>=', startKey)
    .filter('__key__', '<', endKey);

  return datastore.runQuery(query).then(results => {
    const entities = results[0];
    const namespaces = entities.map(
      entity => entity[datastore.KEY].name
    );

    console.log('Namespaces:');
    namespaces.forEach(namespace => console.log(namespace));

    return namespaces;
  });
}

PHP

如要瞭解如何安裝及使用 Cloud Datastore 所需的用戶端程式庫,請參閱 Cloud Datastore 用戶端程式庫一文。詳細資訊請參閱 Cloud Datastore PHP API 參考說明文件

$query = $datastore->query()
    ->kind('__namespace__')
    ->projection(['__key__'])
    ->filter('__key__', '>=', $datastore->key('__namespace__', $start))
    ->filter('__key__', '<', $datastore->key('__namespace__', $end));
$result = $datastore->runQuery($query);
/* @var array<string> $namespaces */
$namespaces = [];
foreach ($result as $namespace) {
    $namespaces[] = $namespace->key()->pathEnd()['name'];
}

Python

如要瞭解如何安裝及使用 Cloud Datastore 所需的用戶端程式庫,請參閱 Cloud Datastore 用戶端程式庫一文。詳細資訊請參閱 Cloud Datastore Python API 參考說明文件

# All namespaces
query = client.query(kind='__namespace__')
query.keys_only()

all_namespaces = [entity.key.id_or_name for entity in query.fetch()]

# Filtered namespaces
start_namespace = client.key('__namespace__', 'g')
end_namespace = client.key('__namespace__', 'h')
query = client.query(kind='__namespace__')
query.key_filter(start_namespace, '>=')
query.key_filter(end_namespace, '<')

filtered_namespaces = [entity.key.id_or_name for entity in query.fetch()]

Ruby

如要瞭解如何安裝及使用 Cloud Datastore 所需的用戶端程式庫,請參閱 Cloud Datastore 用戶端程式庫一文。詳細資訊請參閱 Cloud Datastore Ruby API 參考說明文件

query = datastore.query("__namespace__").
        select("__key__").
        where("__key__", ">=", datastore.key("__namespace__", "g")).
        where("__key__", "<", datastore.key("__namespace__", "h"))

namespaces = datastore.run(query).map do |entity|
  entity.key.name
end

GQL


SELECT __key__ FROM __namespace__
WHERE __key__ >= KEY(__namespace__, 'namespace-a')
  AND __key__ <  KEY(__namespace__, 'namespace-b')

種類查詢

「種類查詢」會傳回金鑰名稱為實體種類名稱的 __kind__ 種類實體。這種類型的查詢間接受限於目前的命名空間,且支援限定 __key__ 虛擬屬性範圍的篩選作業。結果可依照 __key__ 值的遞增順序排序 (但無法依照遞減順序排序)。__kind__ 實體沒有屬性,因此,純金鑰查詢和非純金鑰查詢都會傳回相同的資訊。

以下範例會顯示應用程式所用種類的清單:

C#

如要瞭解如何安裝及使用 Cloud Datastore 所需的用戶端程式庫,請參閱 Cloud Datastore 用戶端程式庫一文。詳細資訊請參閱 Cloud Datastore C# API 參考說明文件

Query query = new Query("__kind__");
var kinds = new List<string>();
foreach (Entity entity in _db.RunQuery(query).Entities)
{
    kinds.Add(entity.Key.Path[0].Name);
};

Go

如要瞭解如何安裝及使用 Cloud Datastore 所需的用戶端程式庫,請參閱 Cloud Datastore 用戶端程式庫一文。詳細資訊請參閱 Cloud Datastore Go API 參考說明文件

前往 GitHub 查看 意見回饋
query := datastore.NewQuery("__kind__").KeysOnly()
keys, err := client.GetAll(ctx, query, nil)
if err != nil {
	log.Fatalf("client.GetAll: %v", err)
}

kinds := make([]string, 0, len(keys))
for _, k := range keys {
	kinds = append(kinds, k.Name)
}

Java

如要瞭解如何安裝及使用 Cloud Datastore 所需的用戶端程式庫,請參閱 Cloud Datastore 用戶端程式庫一文。詳細資訊請參閱 Cloud Datastore Java API 參考說明文件

Query<Key> query = Query.newKeyQueryBuilder().setKind("__kind__").build();
List<String> kinds = new ArrayList<>();
QueryResults<Key> results = datastore.run(query);
while (results.hasNext()) {
  kinds.add(results.next().getName());
}

Node.js

如要瞭解如何安裝及使用 Cloud Datastore 所需的用戶端程式庫,請參閱 Cloud Datastore 用戶端程式庫一文。詳細資訊請參閱 Cloud Datastore Node.js API 參考文件

function runKindQuery() {
  const query = datastore.createQuery('__kind__').select('__key__');

  return datastore.runQuery(query).then(results => {
    const entities = results[0];
    const kinds = entities.map(entity => entity[datastore.KEY].name);

    console.log('Kinds:');
    kinds.forEach(kind => console.log(kind));

    return kinds;
  });
}

PHP

如要瞭解如何安裝及使用 Cloud Datastore 所需的用戶端程式庫,請參閱 Cloud Datastore 用戶端程式庫一文。詳細資訊請參閱 Cloud Datastore PHP API 參考說明文件

$query = $datastore->query()
    ->kind('__kind__')
    ->projection(['__key__']);
$result = $datastore->runQuery($query);
/* @var array<string> $kinds */
$kinds = [];
foreach ($result as $kind) {
    $kinds[] = $kind->key()->pathEnd()['name'];
}

Python

如要瞭解如何安裝及使用 Cloud Datastore 所需的用戶端程式庫,請參閱 Cloud Datastore 用戶端程式庫一文。詳細資訊請參閱 Cloud Datastore Python API 參考說明文件

query = client.query(kind='__kind__')
query.keys_only()

kinds = [entity.key.id_or_name for entity in query.fetch()]

Ruby

如要瞭解如何安裝及使用 Cloud Datastore 所需的用戶端程式庫,請參閱 Cloud Datastore 用戶端程式庫一文。詳細資訊請參閱 Cloud Datastore Ruby API 參考說明文件

query = datastore.query("__kind__").
        select("__key__")

kinds = datastore.run(query).map do |entity|
  entity.key.name
end

GQL


SELECT __key__ FROM __kind__

屬性查詢

「屬性查詢」會傳回表示實體種類相關屬性的 __property__ 種類實體 (不含未建立索引的屬性)。表示「K」種類屬性「P」的實體以下列方式建構:

  • 實體金鑰的種類是 __property__,金鑰名稱是「p」
  • 實體父項金鑰的種類是 __kind__,金鑰名稱是「k」
  • 實體的 property_representation 陣列屬性包含該實體的所有表示法

例如,若您的資料庫只包含屬性分別是 namedone 的兩個 Task 實體:

Key: 'Task:1'
name: 'Read some properties'
done: true

Key: 'Task:2'
name: 'Climb'
done: null

__property__ 查詢傳回的兩個實體就會是:

Key: '__kind__:Task/__property__:name'
property_representation: [ 'STRING' ]

Key: '__kind__:Task/__property__:done'
property_representation: [ 'BOOLEAN', 'NULL' ]

屬性查詢間接受限於目前的命名空間,而且支援使用祖系或針對某個範圍的 __key__ 虛擬屬性進行限定篩選

「純金鑰」屬性查詢比非純金鑰查詢更有效率,因為前者不需要收集屬性的表示法。以下範例擷取應用程式所有實體種類的名稱,以及各個名稱的關聯屬性:

C#

如要瞭解如何安裝及使用 Cloud Datastore 所需的用戶端程式庫,請參閱 Cloud Datastore 用戶端程式庫一文。詳細資訊請參閱 Cloud Datastore C# API 參考說明文件

Query query = new Query("__property__");
var properties = new List<string>();
foreach (Entity entity in _db.RunQuery(query).Entities)
{
    string kind = entity.Key.Path[0].Name;
    string property = entity.Key.Path[1].Name;
    if (kind == "Task")
        properties.Add(property);
};

Go

如要瞭解如何安裝及使用 Cloud Datastore 所需的用戶端程式庫,請參閱 Cloud Datastore 用戶端程式庫一文。詳細資訊請參閱 Cloud Datastore Go API 參考說明文件

前往 GitHub 查看 意見回饋
query := datastore.NewQuery("__property__").KeysOnly()
keys, err := client.GetAll(ctx, query, nil)
if err != nil {
	log.Fatalf("client.GetAll: %v", err)
}

props := make(map[string][]string) // Map from kind to slice of properties.
for _, k := range keys {
	prop := k.Name
	kind := k.Parent.Name
	props[kind] = append(props[kind], prop)
}

Java

如要瞭解如何安裝及使用 Cloud Datastore 所需的用戶端程式庫,請參閱 Cloud Datastore 用戶端程式庫一文。詳細資訊請參閱 Cloud Datastore Java API 參考說明文件

Query<Key> query = Query.newKeyQueryBuilder().setKind("__property__").build();
QueryResults<Key> keys = datastore.run(query);
Map<String, Collection<String>> propertiesByKind = new HashMap<>();
while (keys.hasNext()) {
  Key key = keys.next();
  String kind = key.getParent().getName();
  String propertyName = key.getName();
  Collection<String> properties = propertiesByKind.get(kind);
  if (properties == null) {
    properties = new HashSet<>();
    propertiesByKind.put(kind, properties);
  }
  properties.add(propertyName);
}

Node.js

如要瞭解如何安裝及使用 Cloud Datastore 所需的用戶端程式庫,請參閱 Cloud Datastore 用戶端程式庫一文。詳細資訊請參閱 Cloud Datastore Node.js API 參考文件

function runPropertyQuery() {
  const query = datastore.createQuery('__property__').select('__key__');

  return datastore.runQuery(query).then(results => {
    const entities = results[0];
    const propertiesByKind = {};

    entities.forEach(entity => {
      const key = entity[datastore.KEY];
      const kind = key.path[1];
      const property = key.path[3];

      propertiesByKind[kind] = propertiesByKind[kind] || [];
      propertiesByKind[kind].push(property);
    });

    console.log('Properties by Kind:');
    for (const key in propertiesByKind) {
      console.log(key, propertiesByKind[key]);
    }

    return propertiesByKind;
  });
}

PHP

如要瞭解如何安裝及使用 Cloud Datastore 所需的用戶端程式庫,請參閱 Cloud Datastore 用戶端程式庫一文。詳細資訊請參閱 Cloud Datastore PHP API 參考說明文件

$query = $datastore->query()
    ->kind('__property__')
    ->projection(['__key__']);
$result = $datastore->runQuery($query);
/* @var array<string> $properties */
$properties = [];
/* @var Entity $entity */
foreach ($result as $entity) {
    $kind = $entity->key()->path()[0]['name'];
    $propertyName = $entity->key()->path()[1]['name'];
    $properties[] = "$kind.$propertyName";
}

Python

如要瞭解如何安裝及使用 Cloud Datastore 所需的用戶端程式庫,請參閱 Cloud Datastore 用戶端程式庫一文。詳細資訊請參閱 Cloud Datastore Python API 參考說明文件

query = client.query(kind='__property__')
query.keys_only()

properties_by_kind = defaultdict(list)

for entity in query.fetch():
    kind = entity.key.parent.name
    property_ = entity.key.name

    properties_by_kind[kind].append(property_)

Ruby

如要瞭解如何安裝及使用 Cloud Datastore 所需的用戶端程式庫,請參閱 Cloud Datastore 用戶端程式庫一文。詳細資訊請參閱 Cloud Datastore Ruby API 參考說明文件

query = datastore.query("__property__").
        select("__key__")

entities = datastore.run(query)
properties_by_kind = entities.each_with_object({}) do |entity, memo|
  kind = entity.key.parent.name
  prop = entity.key.name
  memo[kind] ||= []
  memo[kind] << prop
end

GQL


SELECT __key__ FROM __property__

屬性查詢:屬性表示法

非純金鑰屬性查詢亦稱為「屬性表示法查詢」,會傳回各屬性所用值類型的其他相關資訊。實體中的 property_representation 屬性表示「k」種類的「p」屬性,這個屬性是陣列,包含任何「k」種類實體中「p」屬性的所有「表示法」

每個各自使用以下「表示法」 (請注意,有些值類型使用相同的表示法):

值類型 表示法
整數 INT64
浮點數 DOUBLE
布林值 BOOLEAN
文字字串 STRING
位元組字串 STRING
日期和時間 INT64
Datastore 金鑰 REFERENCE
嵌入實體 STRING
陣列 陣列元素的表示法
地理點 POINT
空值 NULL

以下範例使用祖系屬性查詢尋找 Task 種類屬性的所有表示法:

C#

如要瞭解如何安裝及使用 Cloud Datastore 所需的用戶端程式庫,請參閱 Cloud Datastore 用戶端程式庫一文。詳細資訊請參閱 Cloud Datastore C# API 參考說明文件

Key key = _db.CreateKeyFactory("__kind__").CreateKey("Task");
Query query = new Query("__property__")
{
    Filter = Filter.HasAncestor(key)
};
var properties = new List<string>();
foreach (Entity entity in _db.RunQuery(query).Entities)
{
    string kind = entity.Key.Path[0].Name;
    string property = entity.Key.Path[1].Name;
    var representations = entity["property_representation"]
        .ArrayValue.Values.Select(x => x.StringValue)
        .OrderBy(x => x);
    properties.Add($"{property}:" +
        string.Join(",", representations));
};

Go

如要瞭解如何安裝及使用 Cloud Datastore 所需的用戶端程式庫,請參閱 Cloud Datastore 用戶端程式庫一文。詳細資訊請參閱 Cloud Datastore Go API 參考說明文件

kindKey := datastore.NameKey("__kind__", "Task", nil)
query := datastore.NewQuery("__property__").Ancestor(kindKey)

type Prop struct {
	Repr []string `datastore:"property_representation"`
}

var props []Prop
keys, err := client.GetAll(ctx, query, &props)

Java

如要瞭解如何安裝及使用 Cloud Datastore 所需的用戶端程式庫,請參閱 Cloud Datastore 用戶端程式庫一文。詳細資訊請參閱 Cloud Datastore Java API 參考說明文件

Key key = datastore.newKeyFactory().setKind("__kind__").newKey("Task");
Query<Entity> query = Query.newEntityQueryBuilder()
    .setKind("__property__")
    .setFilter(PropertyFilter.hasAncestor(key))
    .build();
QueryResults<Entity> results = datastore.run(query);
Map<String, Collection<String>> representationsByProperty = new HashMap<>();
while (results.hasNext()) {
  Entity result = results.next();
  String propertyName = result.getKey().getName();
  List<StringValue> representations = result.getList("property_representation");
  Collection<String> currentRepresentations = representationsByProperty.get(propertyName);
  if (currentRepresentations == null) {
    currentRepresentations = new HashSet<>();
    representationsByProperty.put(propertyName, currentRepresentations);
  }
  for (StringValue value : representations) {
    currentRepresentations.add(value.get());
  }
}

Node.js

如要瞭解如何安裝及使用 Cloud Datastore 所需的用戶端程式庫,請參閱 Cloud Datastore 用戶端程式庫一文。詳細資訊請參閱 Cloud Datastore Node.js API 參考文件

function runPropertyByKindQuery() {
  const ancestorKey = datastore.key(['__kind__', 'Account']);

  const query = datastore
    .createQuery('__property__')
    .hasAncestor(ancestorKey);

  return datastore.runQuery(query).then(results => {
    const entities = results[0];

    const representationsByProperty = {};

    entities.forEach(entity => {
      const key = entity[datastore.KEY];
      const propertyName = key.name;
      const propertyType = entity.property_representation;

      representationsByProperty[propertyName] = propertyType;
    });

    console.log('Task property representations:');
    for (const key in representationsByProperty) {
      console.log(key, representationsByProperty[key]);
    }

    return representationsByProperty;
  });
}

PHP

如要瞭解如何安裝及使用 Cloud Datastore 所需的用戶端程式庫,請參閱 Cloud Datastore 用戶端程式庫一文。詳細資訊請參閱 Cloud Datastore PHP API 參考說明文件

$ancestorKey = $datastore->key('__kind__', 'Task');
$query = $datastore->query()
    ->kind('__property__')
    ->hasAncestor($ancestorKey);
$result = $datastore->runQuery($query);
/* @var array<string => string> $properties */
$properties = [];
/* @var Entity $entity */
foreach ($result as $entity) {
    $propertyName = $entity->key()->path()[1]['name'];
    $propertyType = $entity['property_representation'];
    $properties[$propertyName] = $propertyType;
}
// Example values of $properties: ['description' => ['STRING']]

Python

如要瞭解如何安裝及使用 Cloud Datastore 所需的用戶端程式庫,請參閱 Cloud Datastore 用戶端程式庫一文。詳細資訊請參閱 Cloud Datastore Python API 參考說明文件

ancestor = client.key('__kind__', 'Task')
query = client.query(kind='__property__', ancestor=ancestor)

representations_by_property = {}

for entity in query.fetch():
    property_name = entity.key.name
    property_types = entity['property_representation']

    representations_by_property[property_name] = property_types

Ruby

如要瞭解如何安裝及使用 Cloud Datastore 所需的用戶端程式庫,請參閱 Cloud Datastore 用戶端程式庫一文。詳細資訊請參閱 Cloud Datastore Ruby API 參考說明文件

ancestor_key = datastore.key "__kind__", "Task"
query = datastore.query("__property__").
        ancestor(ancestor_key)

entities = datastore.run(query)
representations = entities.each_with_object({}) do |entity, memo|
  property_name = entity.key.name
  property_types = entity["property_representation"]
  memo[property_name] = property_types
end

GQL


SELECT * FROM __property__
WHERE __key__ HAS ANCESTOR KEY(__kind__, 'Task')

屬性查詢:篩選

屬性查詢支援以 __kind____property__ 金鑰進行祖系篩選,可將查詢結果限制在單一種類或屬性,如前述的屬性表示法查詢所示。

也可以使用虛擬屬性 __key__ 範圍篩選屬性查詢,其中金鑰表示 __kind____property__ 實體。可以按 __key__ 值遞增排序結果 (不能按遞減排序)。篩選功能適用於種類-屬性對組,先按種類排序,再按屬性排序。例如,假設您的實體包含以下屬性:

  • Task 種類,屬性包括:
    • created
    • priority
    • tags
  • TaskList 種類,屬性包括:
    • created

以下純金鑰屬性查詢:

C#

如要瞭解如何安裝及使用 Cloud Datastore 所需的用戶端程式庫,請參閱 Cloud Datastore 用戶端程式庫一文。詳細資訊請參閱 Cloud Datastore C# API 參考說明文件

Key key = _db.CreateKeyFactory("__kind__").CreateKey("Task");
Key startKey = new KeyFactory(key, "__property__")
    .CreateKey("priority");
Query query = new Query("__property__")
{
    Filter = Filter.GreaterThanOrEqual("__key__", startKey)
};
var properties = new List<string>();
foreach (Entity entity in _db.RunQuery(query).Entities)
{
    string kind = entity.Key.Path[0].Name;
    string property = entity.Key.Path[1].Name;
    properties.Add($"{kind}.{property}");
};

Go

如要瞭解如何安裝及使用 Cloud Datastore 所需的用戶端程式庫,請參閱 Cloud Datastore 用戶端程式庫一文。詳細資訊請參閱 Cloud Datastore Go API 參考說明文件

不適用

Java

如要瞭解如何安裝及使用 Cloud Datastore 所需的用戶端程式庫,請參閱 Cloud Datastore 用戶端程式庫一文。詳細資訊請參閱 Cloud Datastore Java API 參考說明文件

Key startKey = datastore.newKeyFactory()
    .setKind("__property__")
    .addAncestors(PathElement.of("__kind__", "Task"))
    .newKey("priority");
Query<Key> query = Query.newKeyQueryBuilder()
    .setKind("__property__")
    .setFilter(PropertyFilter.ge("__key__", startKey))
    .build();
Map<String, Collection<String>> propertiesByKind = new HashMap<>();
QueryResults<Key> keys = datastore.run(query);
while (keys.hasNext()) {
  Key key = keys.next();
  String kind = key.getParent().getName();
  String propertyName = key.getName();
  Collection<String> properties = propertiesByKind.get(kind);
  if (properties == null) {
    properties = new HashSet<String>();
    propertiesByKind.put(kind, properties);
  }
  properties.add(propertyName);
}

Node.js

如要瞭解如何安裝及使用 Cloud Datastore 所需的用戶端程式庫,請參閱 Cloud Datastore 用戶端程式庫一文。詳細資訊請參閱 Cloud Datastore Node.js API 參考文件

不適用

PHP

如要瞭解如何安裝及使用 Cloud Datastore 所需的用戶端程式庫,請參閱 Cloud Datastore 用戶端程式庫一文。詳細資訊請參閱 Cloud Datastore PHP API 參考說明文件

$ancestorKey = $datastore->key('__kind__', 'Task');
$startKey = $datastore->key('__property__', 'priority')
    ->ancestorKey($ancestorKey);
$query = $datastore->query()
    ->kind('__property__')
    ->filter('__key__', '>=', $startKey);
$result = $datastore->runQuery($query);
/* @var array<string> $properties */
$properties = [];
/* @var Entity $entity */
foreach ($result as $entity) {
    $kind = $entity->key()->path()[0]['name'];
    $propertyName = $entity->key()->path()[1]['name'];
    $properties[] = "$kind.$propertyName";
}

Python

如要瞭解如何安裝及使用 Cloud Datastore 所需的用戶端程式庫,請參閱 Cloud Datastore 用戶端程式庫一文。詳細資訊請參閱 Cloud Datastore Python API 參考說明文件

不適用

Ruby

如要瞭解如何安裝及使用 Cloud Datastore 所需的用戶端程式庫,請參閱 Cloud Datastore 用戶端程式庫一文。詳細資訊請參閱 Cloud Datastore Ruby API 參考說明文件

start_key = datastore.key [["__kind__", "Task"], ["__property__", "priority"]]
query = datastore.query("__property__").
        select("__key__").
        where("__key__", ">=", start_key)

entities = datastore.run(query)
properties_by_kind = entities.each_with_object({}) do |entity, memo|
  kind = entity.key.parent.name
  prop = entity.key.name
  memo[kind] ||= []
  memo[kind] << prop
end

GQL


SELECT __key__ FROM __property__
WHERE __key__ >= KEY(__kind__, 'Task', __property__, 'priority')

會收集以下種類、屬性名稱對組:

Task, priority
Task, tags
TaskList, created

請注意,結果包含 Task 種類和 TaskList 種類的屬性,但不包含 Task 種類的 created 屬性,因為這個屬性不在查詢所指定的範圍內。

本頁內容對您是否有任何幫助?請提供意見:

傳送您對下列選項的寶貴意見...

這個網頁
Cloud Datastore 說明文件