Azure CosmosDB - 复杂结构的部分文档更新(补丁)

Dea*_*one 6 azure-cosmosdb

我正在尝试使用部分文档更新(补丁 API)来更新文档中的子对象,但遇到了麻烦。我发现这个堆栈溢出问题与我的问题相同。但是,接受的答案通过按索引引用数组中的对象来解决问题。我不相信我有能力做到这一点。因此,要使用与其他问题相同的示例文档......

{
    "id": "SalesOrder2",
    "ponumber": "PO15428132599",
    "OrderDate": "2005-07-01T00:00:00",
    "DueDate": "2005-07-13T00:00:00",
    "ShippedDate": "2005-07-08T00:00:00",
    "AccountNumber": "Account2",
    "SubTotal": 6107.082,
    "TaxAmt": 586.1203,
    "Freight": 183.1626,
    "TotalDue": 4893.3929,
    "DiscountAmt": 1982.872,
    "Items": [
        {
            "Id": 1,
            "OrderQty": 3,
            "ProductCode": "A-123",
            "ProductName": "Product 1",
            "CurrencySymbol": "$",
            "CurrencyCode": "USD",
            "UnitPrice": 17.1,
            "LineTotal": 5.7
        },
        {
            "Id": 2,
            "OrderQty": 2,
            "ProductCode": "A-456",
            "ProductName": "Product 2",
            "CurrencySymbol": "$",
            "CurrencyCode": "USD",
            "UnitPrice": 10,
            "LineTotal": 20
        }
    ],    
    "_rid": "BsMkAMc43s4CAAAAAAAAAA==",
    "_self": "dbs/BsMkAA==/colls/BsMkAMc43s4=/docs/BsMkAMc43s4CAAAAAAAAAA==/",
    "_etag": "\"00000000-0000-0000-e136-0dbec04601d7\"",
    "_attachments": "attachments/",
    "_ts": 1637760030
}
Run Code Online (Sandbox Code Playgroud)

我无法保证 Items 数组中 Id 为 1 的项目位于数组的位置 0。同样,Id 为 2 的项目也不能保证位于位置 1。因此,我认为我需要使用 Patch API 的 FilterPredicate 参数来过滤我的结果。但是当我尝试这样做时,我不断收到以下异常:

Microsoft.Azure.Cosmos.CosmosException:响应状态代码不指示成功:PreconditionFailed (412);子状态:1110;活动ID:dbd258ae-0a0a-4a9b-8c25-1d36e137b7c5;原因: ();

如果您能就如何实现这一目标提供任何帮助,我们将不胜感激。

Saj*_*ran 4

正如我在附加链接中回答的那样,补丁要求用户传递需要更新的对象的特定索引。我们正在努力在未来几个月内启用此特定功能,但是作为替代方案,您应该查看Conditional Patch

代码会是这样的,

response = patch(operation, Condition(check if item exists))

if(response == fail/precondition failed)
{
PatchOperation operation = PatchOperation.Add("/Items", [{"Id" : "P-1", "Description" : "My Product"}]);
}
Run Code Online (Sandbox Code Playgroud)

  • 感谢您的答复。我实际上确实尝试过filterPredicate。事实上,我在问题中的错误消息显示“前提条件失败”,这是我尝试以这种方式过滤结果的尝试之一。我得出的结论是,filterPredicate 不会以任何方式过滤文档,而是简单检查是否满足过滤条件以及是否允许修补操作继续。 (4认同)
  • @Sajeetharan,有这方面的消息吗? (2认同)