2015-04-19 3 views
1

Для хранения в GCD я хочу использовать Google Cloud Datastore JSON API, но я не мог написать правильный объект запроса Json для объекта с другим членом класса. Рассмотрим У меня есть 2 классов:Как хранить класс с подклассом API Google Cloud Datastore JSON?

public class Foo { 
    private String id; 
    private Bar bar; 
    // getter and setter... 
} 

public class Bar { 
    private String name; 
    private String pass; 
    // getter and setter... 
} 

Затем я создаю объект класса «Foo», которые содержат объект класса «Бар». Так что я хочу вставить этот объект в Cloud Datastore. Я написал этот орган запроса:

{ 
    "transaction":"some bytes", 
    "mutation":{ 
    "insert":[ 
     { 
     "key":{ 
      "partitionId":{ 
      "datasetId":"s~my-dataset-id" 
      }, 
      "path":[ 
      { 
       "kind":"Foo", 
       "name":"id" 
      } 
      ] 
     }, 
     "properties":{ 
      "bar":{ 
      "entityValue":{ 
       "name":{ 
       "stringValue":"Jack" 
       }, 
       "pass":{ 
       "stringValue":"1234" 
       } 
      }, 
      "indexed":false 
      }, 
      "id":{ 
      "stringValue":"id" 
      } 
     } 
     } 
    ] 
    } 
} 

Затем все поля, кроме «бара», будут сохраняться в облачном хранилище данных. Я использовал «entityValue», но кажется, что я должен включить всю структуру сущности (спасибо Адаму за это). Но мне это не нужно как другое сущность, и я не должен использовать «entityValue». Итак, как мне изменить тело запроса на вставку такого объекта?

Кстати, я могу вставить Bar объект (но не Foo) по следующему запросу:

{ 
    "transaction":"some bytes", 
    "mutation":{ 
    "insert":[ 
     { 
     "key":{ 
      "partitionId":{ 
      "datasetId":"s~my-project-id" 
      }, 
      "path":[ 
      { 
       "kind":"Bar", 
       "name":"John" 
      } 
      ] 
     }, 
     "properties":{ 
      "pass":{ 
      "stringValue":"1234" 
      }, 
      "name":{ 
      "stringValue":"John" 
      } 
     } 
     } 
    ] 
    } 
} 

Related link

+0

Ваш запрос выглядит правильно. Получаете ли вы сообщение об ошибке при его выполнении? –

+0

Когда я пытаюсь сохранить объекты класса Foo, ничего не сохраняется для встроенного объекта Bar. – Sadegh

+0

Как вы извлекаете объект Bar? –

ответ

1

Вы можете включить Bar как entityValue. Это значение выглядит как обычные Сущности, но он не должен иметь ключ. Это значение объекта делает не необходимости существовать отдельно в Datastore.

Например:

{ 
    "mutation":{ 
    "insert":[ 
     { 
     "key":{ 
      "path":[ 
      { 
       "kind":"Foo", 
       "name":"id" 
      } 
      ] 
     }, 
     "properties":{ 
      "bar":{ 
      "entityValue":{ 
       "properties": { 
       "name":{ 
        "stringValue":"Jack" 
       }, 
       "pass":{ 
        "stringValue":"1234" 
       } 
       } 
      }, 
      "indexed":false 
      }, 
      "id":{ 
      "stringValue":"id" 
      } 
     } 
     } 
    ] 
    }, 
    "mode": "NON_TRANSACTIONAL" 
} 

Также как примечание стороны, обратите внимание, что ключ к Foo здесь уже ушел из partitionId. Это предпочтительная вещь, Datastore заполнит правильный partitionId для вас.

+0

Спасибо. Он работает нормально. Объекты 'bar' сохранены как строка JSON, но я ожидаю другую форму! Есть ли способ запросить их? – Sadegh

+1

Пока нет - вы не можете запрашивать отдельные поля, потому что 'entityValue' помечен как' "indexed": false'. Мы активно работаем над поддержкой индексированных значений сущностей. Затем вы сможете поместить его с индексом «indexed»: true' и запросить конкретные свойства как «bar.name ==» Jack «'. Если вы хотите сделать это прямо сейчас, вы можете сохранить отдельное свойство с именем «bar.name» для свойств, которые вы хотите запросить. Когда значения сущностей поддерживают индексирование, вы можете обновить свой код, чтобы вместо этого использовать свойства индексированного значения сущности. –

0

Вы должны включать в себя всю структуру сущности для «EntityValue '(включая поля «ключ» и «свойства»). Это связано с тем, что вы ссылаетесь на отдельный объект в хранилище данных, а не только на другую структуру данных, встроенную в текущую. См:

наборов данных: Entity Формат
https://cloud.google.com/datastore/docs/apis/v1beta2/entity

Поле 'EntityValue "(Entity)' является признаком того, что вам нужно, чтобы начать с начала этого же представления объекта для нового объекта.

+0

Вы правы. Я думал, что «entityValue» может обрабатывать встроенный объект класса, но мне он не нужен как другой Entity, поэтому как мне изменить тело запроса?(Я отредактирую свой вопрос) – Sadegh

+0

Если все, что вы хотите сделать, это сохранить подкласс как встроенное свойство какого-либо объекта, лучшим выбором будет его сериализация вручную и сохранение необработанного JSON в качестве встроенного StringProperty. Вложенному объекту по-прежнему нужен ключ, иначе он не является сущностью. Было бы невозможно ссылаться на него в хранилище данных и отличать его от некоторого свойства какого-либо другого объекта (как и в C++, вы можете ссылаться на класс «Бар» самостоятельно). – Adam

Смежные вопросы