2012-10-25 41 views
5

Tôi đang sử dụng DynamoDB để lưu trữ các sự kiện. Chúng được lưu trữ trong 1 bảng sự kiện với một khóa băm 'ID nguồn' và một khóa dãy 'phiên bản'. Mỗi khi một sự kiện mới xảy ra cho một nguồn, tôi muốn thêm một mục mới với ID nguồn và một phiên bản tăng nr.DynamoDB: Cách thực hiện ghi có điều kiện để thực thi khóa Hash + Range duy nhất

Có thể chỉ định ghi có điều kiện sao cho một mục trùng lặp (cùng một khóa băm và cùng một phím phạm vi) không bao giờ có thể tồn tại? Và nếu vậy, làm thế nào bạn sẽ làm điều này?

Tôi đã làm điều này thành công cho các bảng chỉ với một Hash chính:

Map<String, ExpectedAttributeValue> expected = new HashMap<String, ExpectedAttributeValue>(); 
expected.put("key", new ExpectedAttributeValue().withExists(false)); 

Nhưng không chắc chắn làm thế nào để xử lý băm + dãy phím ....

+1

Câu hỏi thực sự cũ, nhưng dynamodb có phiên bản tăng nguyên tử, hãy xem xét điều đó (chủ yếu cho những người cuộn dây ở đây) –

+0

Tài liệu cập nhật nguyên tử tại đây: http://docs.aws.amazon.com/amazondynamodb/latest/APIReference/ API_UpdateItem.html – Deemoe

Trả lời

3

Tôi không biết Java SDK cũng nhưng bạn có thể chỉ định "Exist = False" trên cả hai số range_keyhash_key.

Có thể một ý tưởng hay hơn có thể là sử dụng dấu thời gian thay vì số phiên bản? Nếu không, cũng có các kỹ thuật để tạo các id duy nhất.

+0

Cảm ơn mẹo!Tôi sẽ cố gắng chỉ định "Exist = False" trên khóa phạm vi và khóa băm. Chỉ cần quan tâm, tại sao bạn đề nghị nó sẽ là tốt hơn để sử dụng một dấu thời gian thay vì một số phiên bản? – stikkos

+0

Chỉ để dành cho bạn thế hệ "id" :) – yadutaf

+0

Tôi đã thử điều này nhưng vẫn không thể làm việc này .... Tôi nhận được lỗi: "Không thể mong đợi một thuộc tính có giá trị được chỉ định trong khi mong đợi nó không tồn tại ". Bất kỳ ý tưởng?? – stikkos

2

Tôi đã cố gắng thực thi kết hợp duy nhất của các khóa băm và phạm vi và đi qua bài đăng này. Tôi thấy rằng nó không hoàn toàn trả lời câu hỏi của tôi nhưng chắc chắn chỉ cho tôi đi đúng hướng. Đây là một nỗ lực để dọn dẹp các đầu lỏng lẻo.

Dường như DynamoDB thực sự thực thi kết hợp duy nhất của khóa băm và phạm vi theo thiết kế. Tôi xin trích dẫn

"Tất cả các mục trong bảng phải có giá trị cho thuộc tính khóa chính và Amazon DynamoDB đảm bảo rằng giá trị cho tên mà là duy nhất"

từ http://aws.amazon.com/dynamodb/ dưới phần với Primary Key tiêu đề.

Trong các thử nghiệm của riêng tôi bằng cách sử dụng putItem với aws-sdk cho các nút, tôi đã có thể đăng hai mục giống nhau mà không tạo ra lỗi. Khi tôi kiểm tra cơ sở dữ liệu, chỉ có một mục được chèn vào thực tế. Dường như cuộc gọi thứ hai tới putItem với cùng một kết hợp băm và dải ô được xử lý giống như bản cập nhật cho mục gốc. Tôi cũng đã nhận được lỗi "Không thể mong đợi một thuộc tính có giá trị được chỉ định trong khi mong đợi nó không tồn tại" khi tôi cố gắng đặt tùy chọn tồn tại = false trên khóa băm và phím phạm vi với các giá trị được đặt. Để giải quyết lỗi này, tôi đã xóa giá trị dưới khóa băm và phạm vi dự kiến ​​và bắt đầu tạo lỗi xác thực khi tôi cố gắng chèn cùng một khóa hai lần.

Vì vậy, lệnh chèn của tôi trông như thế này (sẽ khác nhau cho Java, nhưng hy vọng bạn sẽ có được ý tưởng)

{  "TableName": "MyTableName", 

"Item"   : { 

          "HashKeyFieldName": { 

            "S": HashKeyValue 

          }, 

          "RangeKeyFieldName": { 

            "N": currentTime.getTime().toString() 

          }, 

          "OtherField": { 

            "N": "61404032632" 

          } 

         }, 

"Expected": { 

         "HashKeyFieldName"  : { "Exists" : false}, 
         "RangeKeyFieldName"  : { "Exists" : false} 

        } 

}

Trong khi ban đầu tôi đã cố gắng để làm một chèn có điều kiện để kiểm tra nếu có một giá trị băm và giá trị phạm vi giống như những gì tôi đã cố gắng để chèn, bây giờ tôi chỉ cần kiểm tra xem HashField và RangeField tồn tại ở tất cả. Nếu chúng tồn tại, điều đó có nghĩa là tôi đang cập nhật một mục thay vì chèn.

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