Ключ раздела CosmosDb для вложенного Java-объекта / Json (Spring Boot) - PullRequest
0 голосов
/ 14 марта 2019

Я пытаюсь разделить коллекцию на основе вложенного объекта Java и соответствующего Json. Я знаю, что это может показаться неразумным, но я работаю над проектом, находящимся в стадии разработки, и макет, ожидаемый нашей клиентской командой, не является гибким в данный момент. Пример.) Эквивалент Json для объекта с именем receiveItem выглядит следующим образом:

{
   "id": "1",
   "item": { 
      "itemId": "1",
      "name": "itemName",
      "value": 4.98,
      ...
   }, 
   "tax": {
      "rate": 0.15,
      "state": "FL",
      ...
   },
   ...
}

Можно ли создать ключ разделения в Azure с синтаксисом, аналогичным «/item.itemId»? Любой другой способ сделать это, используя itemId в качестве ключа раздела для коллекции receiveItem?

Если есть ответ, как это сделать в Azure, мне также было бы интересно выяснить, как будет выглядеть соответствующий код Java. В отличие от C #, аннотация @PartitionKey, похоже, не имеет атрибута для указания вложенного объекта (как в [ParitionKey(item.id)]), и я не вижу способа сделать это в моих конфигурациях (при загрузке Spring).

На Java будет выглядеть так:

@Data
@NoArgsConstructor
@FullArgsContructor
@ToString
@Document(collection="receiptItems")
public class ReceiptItem {
   @Id
   int id;
   // @PartitionKey???
   Item item;
   Tax tax;
   ...
}

Ответы [ 2 ]

1 голос
/ 15 марта 2019

У меня возникла похожая проблема, и мне пришлось вытащить мой ключ раздела из гнезда. Даже после этого я не смог найти способ сообщить моему MongoRepository при весенней загрузке о ключе раздела. Я поднял вопрос здесь - Spring Boot не может обновить коллекцию с осколками на Azure Cosmos db (MongoDb)

Как обычно, вставка и выборка будут работать нормально, если в вашем объекте присутствует ключ раздела. Это запросы на обновление и удаление, которые не будут выполнены.

Я нашел обходной путь. Мне пришлось автоматически подключить MongoTemplate и создать базовый запрос для обновления моего объекта.

public DocumentDev updateProcessedFlag(DocumentDev request) {
Query query = new Query();
query.addCriteria(Criteria.where("_id").is(request.getId()));
// dNumber is my partition key here.
query.addCriteria(Criteria.where("dNumber").is(request.getDNumber()));
Update update = new Update();
update.set("processed", request.isProcessed());
mongoTemplate.updateFirst(query, update, request.getClass());
return request;
}

Другим вариантом этого может быть использование функции udate.fromDocument (Document, Exclude), где вам может потребоваться преобразовать ваш объект в документ BSON и использовать его следующим образом.

public DocumentDev updateProcessedFlag(DocumentDev request) {
// convert your object to document
Gson gson = new GsonBuilder().create();
String json = gson.toJson(pojo);
Document doc = Document.parse(json);

// create query
Query query = new Query();
query.addCriteria(Criteria.where("_id").is(request.getId()));
query.addCriteria(Criteria.where("dNumber").is(request.getDNumber()));
Update update = Update.fromDocument(doc,"");
// run update command using mongoTemplate
mongoTemplate.updateFirst(query, update, request.getClass());
return request;
}

Если есть какой-либо способ сообщить весенней загрузке о ключе раздела. Это было бы лучшим решением. До тех пор, пока я не нашел этот способ.

0 голосов
/ 21 марта 2019

Пока что в Azure возможно иметь «вложенный» ключ раздела.Например, /item/id будет использоваться, чтобы сделать поле id в item ключом раздела.Соответствующий документ Json будет выглядеть следующим образом:

{
   "id": "1",
   "item": { 
      "itemId": "1",
      "name": "itemName",
      "value": 4.98,
      ...
   }, 
   "tax": {
      "rate": 0.15,
      "state": "FL",
      ...
   },
   ...
}

К сожалению, вложенные ключи разделов в настоящее время не поддерживаются в Spring.Большое спасибо ChrisAnderson-MSFT за участие в поиске решения и за открытие проблемы на github, которую можно найти здесь: https://github.com/Microsoft/spring-data-cosmosdb/issues/350.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...