1

データストア ビューアーの編集ページでどのようにそれを行ったのか知りたいのですが、助けていただければ幸いです。かなり単純に見えますが、それを理解することはできません。これは、私が何を意味するかを正確に示すスクリーンショットです。デコードされたエンティティ キー

4

3 に答える 3

3

クラスには、Key種類と (名前または ID) と、parentnull または別のキーになる もあります。

エンティティのキ​​ーから始めて、種類と ID を出力し、次に親を探し、その種類と ID を出力し、次にその親を探し、種類と ID を出力します。

https://developers.google.com/appengine/docs/java/javadoc/com/google/appengine/api/datastore/Keyを参照してください

于 2012-12-03T21:07:42.890 に答える
1

文字列でエンコードされた Key には、それ自体とそのすべての祖先の種類と ID が実際に含まれています。ブレッドクラムを作成するために、親フィールドが null になるまでサーバー側でループしても問題ありません (基本的には文字列 + オブジェクトの操作であり、データストアへのクエリは含まれません)。

JS でクライアント側で行われたかどうかはわかりませんが、基本的には base64 エンコーディングなので可能なはずです。アルゴリズムについてはEncode()https://github.com/golang/appengine/blob/master/datastore/key.goの関数を参照してください。

このオンライン ツールは、キーをデコードおよびエンコードします: http://datastore-key.appspot.com。また、JSON 出力のサービスとしても機能します。Go コードのサーバー側は、データストア クエリを発行しません。

于 2014-07-25T15:04:53.583 に答える
0

Javaの答えはおそらくこれです:

https://cloud.google.com/appengine/docs/java/javadoc/com/google/appengine/api/datastore/KeyFactory#stringToKey(java.lang.String)

これによりKey、エンコードされた表現から が得られます。これにより、種類、名前空間、ID、親、および appId を照会できます。これにより、上記のコメントで言及されている python の回答と同様の処理が可能になります。

例として、次のコード フラグメントは、1 つの親を持ち、元は別の GAE アプリケーションから取得されたキーを再マップします。

  String key = "sflkjsadfliasjflkhsa"; // replace this by a real key

  // a not very elegant way to get the current app id
  String appId = KeyFactory.createKey("dummy", 1).getAppId();

  // here, the key is converted from an encoded String to a key object
  Key keyObj = KeyFactory.stringToKey(key);
  String oldAppId = keyObj.getAppId();

  // if the app id is different, we have to convert the key
  if (!appId.equals(oldAppId)) {
      // creeate a new key with parent having the correct app id
      Key parentKey = keyObj.getParent();
      Key newParentKey = KeyFactory.createKey(parentKey.getKind(), parentKey.getId());
      Key newKeyObj = KeyFactory.createKey(newParentKey, keyObj.getKind(), keyObj.getId());

      // convert the key back to a String replacing the original one
      String newKey = KeyFactory.keyToString(newKeyObj);

      // replace this by a call to your logger
      Log.warn(getClass(), "remapped key: appId: " + oldAppId + " -> " + appId + " oldKey: " + key + " -> " + newKey);

      key = newKey;
  }
于 2015-07-04T20:18:23.740 に答える