2016-09-09 12 views
5

Tôi muốn có một danh sách giới hạn trong một mục DynamoDB. Tôi muốn có thể thêm một khoản mục vào mặt trước của danh sách, và sau đó thả mục ra phía sau nếu nó vượt quá một kích thước nhất định.Nối và cắt bớt danh sách trong thao tác cập nhật DynamoDB đơn lẻ?

Trong ví dụ của tôi, tôi sẽ đặt nắp đến 3, hãy thêm yếu tố "6", và hiển thị trước/sau trạng thái:

    { } -> { "myList": [6] } 
     { "myList": [1] } -> { "myList": [6, 1] } 
{ "myList": [3, 2, 1] } -> { "myList": [6, 3, 2] } 

Nhưng tôi không thể sử dụng biểu thức cập nhật sau đây để kết hợp một SETREMOVE hoạt động trên myList:

# (":empty" set to an empty list in the value map) 
SET myList = list_append(:v, if_not_exists(myList, :empty)) REMOVE myList[3] 

Cố gắng sử dụng này kết quả biểu hiện trong một ngoại lệ (bằng cách sử dụng API Tài liệu trong Java):

Invalid UpdateExpression: Two document paths overlap with each other; must remove or rewrite one of these paths 

Nó sẽ hoạt động nếu tôi chia SETREMOVE thành hai yêu cầu cập nhật khác nhau. Có bất kỳ thủ thuật nào có thể cho phép tôi làm điều đó trong một yêu cầu không?

Trả lời

4

Hiện tại trong DynamoDB, bạn không thể có cùng một đường dẫn tài liệu trong nhiều thao tác, ngay cả khi chúng là các hoạt động riêng biệt. Điều này là do DynamoDB không thể đảm bảo thứ tự thực hiện hoạt động trong cùng một biểu thức cập nhật.

+0

Vâng, tôi không ngạc nhiên khi không thể thực hiện trực tiếp trong một thao tác đơn lẻ. Tôi đã hy vọng có thể có một số lừa hoặc làm việc xung quanh đó sẽ thực hiện nó. (Thực hiện hai yêu cầu riêng biệt sẽ mở ra cánh cửa cho các điều kiện chủng tộc cũng như nếu bạn đang thực hiện cập nhật đồng thời, mặc dù may mắn đó không phải là vấn đề trong trường hợp sử dụng của tôi ...) – ryryguy

+0

Vâng. Trong hầu hết các trường hợp, bạn có thể ngăn các điều kiện chủng tộc với các biểu thức có điều kiện, thử lại và sử dụng phép cộng và trừ nguyên tử nếu bạn đang xử lý các số. –

Các vấn đề liên quan