分区键在 CRUD 操作中是强制性的吗?宇宙数据库 Java SDKv4

Is Partition key mandatory in the CRUD operations | cosmos db Java SDKv4

我正在从 documentdb SDK 迁移到 cosmosdb SDK v4。

我看到以下同步模式 api 方法

createItem -- 有公开的方法,并且没有分区键作为参数。

upsertItem-- 无法将分区键作为参数传递。

replaceItem & deleteItem --- 1 个以分区键作为参数的方法。

撇开性能不谈,

  1. 即使没有分区键,所有这些方法都有效吗?
  2. 发送 null 与不发送分区键相同? (对于 null,我认为 cosmos 可能会寻找空分区,但在 replaceItemdeleteItem 的情况下,它是一个以分区键作为参数的单一暴露方法。这是否意味着分区键对于 replaceItem & deleteItem )

无法找到任何官方文档确认。任何线索都会有很大帮助。

您在创建集合时声明了分区键。您传递给“createItem”、“upsertItem”等方法的对象将有一个 属性 名称与集合创建期间声明的分区键匹配的字段。该字段的值将用作分区键值。

示例:

集合分区键“/customerId”

要持久化的对象:

    public class Order {
        private String id;
        private String status;
        private String customerId;
        private BigDecimal subTotal;
        private List<LineItem> lineItems = new ArrayList<>();
}
        

创建订单:

    public Mono<Integer> createOrder(Order order) {
        return cosmosDB
                .getContainer()
                .createItem(order)
                .map(CosmosItemResponse::getStatusCode);
}

您需要一个完整的工作示例,一个使用 V4 java SDK 的商店应用程序。 https://github.com/RaviTella/store

  1. 在 CRUD 操作期间(通过参数或 CosmosItemRequestOptions)明确告诉 cosmos 分区键不是强制性的。 如果不可用,cosmos 将读取文档(正在 added/updated)并找到分区键。

  2. 将分区键参数作为 null 发送与不发送分区键相同。

    a. container.createItem(document, new PartitionKey(null), null); // cosmos looks for partition defined by null key
    b. container.createItem(document, null, null); //  scans document to figure out partition key value as stated in (1)