1

我正在尝试根据嵌套的 Java 对象和相应的 Json 对集合进行分区。我知道这样做可能看起来不合理,但我正在从事一个远未开发的项目,而我们的客户团队所期望的布局目前并不灵活。例如)一个名为receiptItem的对象的等效Json如下所示:

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

是否可以使用“/item.itemId”行的语法在 Azure 中创建分区键?在使用 itemId 作为receiptItem 集合的分区键时,还有其他方法可以解决这个问题吗?

如果有关于如何在 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;
   ...
}
4

2 回答 2

2

我遇到了类似的问题,我不得不从巢中移出我的分区键。即使在那之后,我也找不到任何方法让 Spring Boot 中的 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;
}

如果有任何方法可以告诉 spring boot 关于分区键。那将是一个更好的解决方案。在那之前,这是我想出的解决方法。

于 2019-03-15T01:01:43.827 回答
-1

现在当然可以在 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 .

于 2019-03-21T01:55:39.540 回答