データストア ビューアーの編集ページでどのようにそれを行ったのか知りたいのですが、助けていただければ幸いです。かなり単純に見えますが、それを理解することはできません。これは、私が何を意味するかを正確に示すスクリーンショットです。
3 に答える
クラスには、Key
種類と (名前または ID) と、parent
null または別のキーになる もあります。
エンティティのキーから始めて、種類と ID を出力し、次に親を探し、その種類と ID を出力し、次にその親を探し、種類と ID を出力します。
https://developers.google.com/appengine/docs/java/javadoc/com/google/appengine/api/datastore/Keyを参照してください
文字列でエンコードされた Key には、それ自体とそのすべての祖先の種類と ID が実際に含まれています。ブレッドクラムを作成するために、親フィールドが null になるまでサーバー側でループしても問題ありません (基本的には文字列 + オブジェクトの操作であり、データストアへのクエリは含まれません)。
JS でクライアント側で行われたかどうかはわかりませんが、基本的には base64 エンコーディングなので可能なはずです。アルゴリズムについてはEncode()
、https://github.com/golang/appengine/blob/master/datastore/key.goの関数を参照してください。
このオンライン ツールは、キーをデコードおよびエンコードします: http://datastore-key.appspot.com。また、JSON 出力のサービスとしても機能します。Go コードのサーバー側は、データストア クエリを発行しません。
Javaの答えはおそらくこれです:
これにより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;
}