2016-03-01 22 views
8

Tôi muốn 'upsert' một tài liệu trong DynamoDB. Tức là, tôi muốn chỉ định một khóa và một tập hợp các cặp giá trị/trường. Nếu không có tài liệu nào tồn tại với khóa đó, tôi sẽ không tạo tài liệu với khóa đó và cặp khóa/giá trị mà tôi đã chỉ định. Nếu một tài liệu tồn tại với khóa đó, tôi muốn các trường mà tôi đã chỉ định được đặt thành các giá trị được chỉ định (nếu các trường đó không tồn tại trước đó, thì chúng sẽ được thêm vào). Bất kỳ trường nào khác, không xác định trên tài liệu hiện có sẽ bị bỏ lại một mình.Có thể nâng cấp các trường lồng nhau trong DynamoDB không?

Dường như tôi có thể thực hiện điều này khá tốt với cuộc gọi UpdateItem, khi cặp trường/giá trị tôi đang đặt là tất cả các trường cấp cao nhất. Nếu tôi có cấu trúc lồng nhau, UpdateItem sẽ hoạt động để đặt các trường lồng nhau, miễn là cấu trúc tồn tại. Nói cách khác, nếu tài liệu hiện tại của tôi có "foo": {}, thì tôi có thể đặt thành công "foo.bar": 42.

Tuy nhiên, dường như tôi không thể đặt "foo.bar": 42 nếu không có đối tượng foo (như trong trường hợp không có tài liệu nào với trường được chỉ định, và 'upsert' của tôi hoạt động như một Tôi tìm thấy a discussion trên diễn đàn AWS từ một vài năm trước, điều này có vẻ hàm ý rằng điều tôi muốn làm không thể thực hiện được, nhưng tôi hy vọng điều này đã thay đổi gần đây, hoặc có thể ai đó biết về cách để làm điều đó?

+1

Để cung cấp cho bạn một datapoint, tôi nhìn vào điều này vào tháng 5 năm 2015 (ish) và cùng một vấn đề mà bạn đã đề cập vẫn tồn tại. Tôi đã không thể đạt được mục tiêu của upsert lồng nhau, vì vậy tôi đã phải thay đổi cách tiếp cận của tôi cho vấn đề và cách tôi lưu trữ dữ liệu. – mkobit

+0

@mkobit cảm ơn điểm dữ liệu của bạn; đó là kết luận mà tôi cũng đã đến. Vì dữ liệu của tôi có số lượng lồng nhau cố định, tôi đã lưu trữ nó phẳng, với các trường có tên là 'foo_bar', và tôi thêm mã marshalling/unmarshalling vào lớp DAO của tôi để dịch nó. Đó là một nỗi đau, nhưng nó dường như hoạt động tốt đủ (cho đến nay ít nhất) – pkaeding

+2

Cùng một vấn đề một năm sau đó. Phần gây phiền nhiễu là Dynamo không ném một lỗi, nó chỉ không lưu phần đó của cây dữ liệu. – Jelling

Trả lời

0

UpdateItem hoạt động như hoạt động "upsert": Mục được cập nhật nếu nó tồn tại trong bảng , nhưng nếu không, một mục mới sẽ được thêm vào (được chèn). http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/SQLtoNoSQL.UpdateData.html

+2

Vâng, tôi đã đọc nó. Nhưng nếu bạn đọc câu hỏi của tôi, tôi không thể làm nổi bật các đối tượng lồng nhau. – pkaeding

+0

Tôi đã sử dụng nó với các đối tượng lồng nhau và nó hoạt động (w/DynamoDBMapper). http://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodbv2/datamodeling/DynamoDBMapper.html – Neil

0

Đó ("foo.bar": 42) có thể đạt được bằng cách sử dụng truy vấn dưới đây:

table.update_item(Key = {'Id' : id}, 
       UpdateExpression = 'SET foo = :value1', 
       ExpressionAttributeValues = {':value1': {'bar' : 42}} 
      ) 

Hope this helps :)

+0

nhưng nếu giá trị ban đầu của 'foo' có các khóa khác, ngoài' giá trị bar' mà bạn đang cập nhật, chúng sẽ không bị mất? Ví dụ, nếu giá trị ban đầu là '{foo: {biz: 33, bar: 0}}' và bạn muốn thay đổi 'foo.bar', để phần còn lại của đối tượng' foo' không thay đổi, nó có hoạt động không? – pkaeding

+0

Tôi đã trả lời câu hỏi tương tự câu hỏi này. https://stackoverflow.com/questions/35569733/how-to-adding-an-empty-or-data-map-in-dynamodb/46791740#46791740 Vui lòng kiểm tra và nhận xét về điều đó nếu điều đó có hiệu quả. – manojpt

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