簡體   English   中英

如何部分更新DynamoDB表?

[英]How to Partially Update a DynamoDB Table?

我們在DynamoDB中進行部分更新時遇到了很多麻煩。

嘗試使用聚合而不是實體來使用NoSQL中的最佳實踐,因此我們的數據看起來有點像這樣:

[
{
    "userLogin": {
        "ipAddress": "123.222.121.1234",
        "lastLogin": "2017-10-16T17:38:59.818Z",
        "userAgent": "bob",
        "geoLocation": "lat-121 long-312"
    },
    "addresses": {
        "billingAddress": {
            "streetName": "york street",
            "province": "ontario",
            "city": "toronto",
            "streetNumber": "18",
            "postalCode": "m5a2v7"
        },
        "businessAddress": {
            "streetName": "york street",
            "province": "ontario",
            "city": "toronto",
            "streetNumber": "18",
            "postalCode": "m5a2v7"
        },
        "mailingAddress": {
            "streetName": "york street",
            "province": "ontario",
            "city": "toronto",
            "streetNumber": "18",
            "postalCode": "m5a2v7"
        },
    },
    "paymentTransaction": {
        "orderId": 5,
        "amount": 75,
        "transactionTimestamp": "2017-10-16T17:38:59.818Z"
    },
    "userId": "00uc4sxyi7gfQoFum0h7",
    "phoneNumbers": {
        "workNumber": "647-123-1234",
        "homeNumber": "647-321-4321"
    },
    "userProfile": {
        "role": "admin",
        "verifiedTimeStamp": "2017-10-16T17:38:59.818Z",
        "termsConditionTimeStamp": "2017-10-16T17:38:59.818Z",
        "verified": "TRUE",
        "createdTimeStamp": "2017-10-16T17:38:59.818Z",
        "termsConditionVersion": "1.0",
        "email": "kyle.truong@test.io"
    }
}

]

我們要做的就是用這樣的身體發出請求:

PUT /api/user-profiles/00uc4sxyi7gfQoFum0h7
body: {
    "userLogin": { "lastLogin": "2017-12-16T17:38:59.818Z" }
}

並讓它更新User表中的one屬性。

updateItem API似乎需要在更新之前定義要更新的屬性,但我們希望它基於請求的主體更靈活和動態。

這個帖子好像說不可能:

如何一次更新DynamoDB表中的多個項目

如果是這樣,那么在DynamoDB中只更新項目中的部分屬性對象的最佳方法是什么?

在dynamoDB中,如果userLogin是地圖類型,則可以更新lastLoginkey的值。 在Java下面的代碼可能有所幫助。 這里的列名是userLogin,newKey是lastLogin。 完整的代碼片段可以在這里找到

UpdateItemSpec updateItemSpec = new UpdateItemSpec().withPrimaryKey(primaryKey,primaryKeyValue).withReturnValues(ReturnValue.ALL_NEW).
        withUpdateExpression("set #columnName." + newKey + " = :columnValue").
        withNameMap(new NameMap().with("#columnName", updateColumn)).
        withValueMap(new ValueMap().with(":columnValue", newValue)).withConditionExpression("attribute_exists("+ updateColumn +")");

table.updateItem(updateItemSpec);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM