2012-01-23 36 views
14

Amazon AWS DynamoDB câu hỏi.DynamoDB truy vấn với So sánh nhà khai thác

Có những ví dụ của việc sử dụng RangeKeyCondition và ComparisonOperators như CHỨA, IN, GIỮA. Tôi đang cố gắng để lấy dữ liệu dựa trên một composite RangeKey (nối và phân cách). Ví dụ: date + author + keywords cho bảng books. Giả sử HashValue là "book" trong trường hợp này (nó có thể là book, dvd, video, link etc). Tôi muốn chọn tất cả các sách có chứa từ khóa "ma thuật" hoặc tất cả các sách của tác giả "John Doe". Một kỷ lục mẫu/item sẽ trông như thế này:

Hash ------ Phạm vi ---------------------------- ------------------------------------- attribute1 ... attributex

cuốn sách --- --- 2012-1-20 ~ john doe ~ phiêu lưu ~ ảo thuật ~ du lịch ---------------- mô tả ... một số nội dung

Khi cố gắng sử dụng toán tử có điều kiện IN hoặc CONTAINS, tôi nhận được lỗi sau: đối tượng (CFSimpleXML) 20 công khai '__type' => string 'com.amazon.coral.validate # ValidationException' (length = 45) public 'message' => string 'Attempted ràng buộc có điều kiện không phải là hoạt động có thể lập chỉ mục '

Không thể tìm thấy bất kỳ ví dụ sử dụng các ComparisonOperators. Mọi sự trợ giúp sẽ rất được trân trọng.

Cảm ơn.

Trả lời

34

Điều quan trọng là nhận ra sự khác biệt giữa các API tìm kiếm hai Query and Scan in Amazon DynamoDB:

  • Query

    A query operation searches only primary key attribute values and supports a subset of comparison operators on key attribute values to refine the search process. A query returns all of the item data for the matching primary keys (all of each item's attributes) up to 1MB of data per query operation. [...]

    [..] For information about each comparison operator available for query operations, see the API entry for Query .

    [emphasis mine]

  • Scan

    A scan operation scans the entire table. You can specify filters to apply to the results to refine the values returned to you, after the complete scan. Amazon DynamoDB puts a 1MB limit on the scan (the limit applies before the results are filtered). [...]

    [...] For information about each comparison operator available for scan operations, see the API entry for Scan .

Bây giờ, su pported subset cho RangeKeyCondition: ComparOperator của API truy vấn không bao gồmCONTAINSIN, cả hai đều có sẵn trong Quét API; chỉ có toán tử so sánh BETWEEN có sẵn trong cả hai API.

Giới hạn này rất có thể xuất phát từ những cân nhắc về hiệu suất, tức là hỗ trợ CONTAINS có thể sẽ đánh bại mục tiêu DynamoDB về hiệu suất/thông lượng dự đoán được.

Như thường lệ với các giải pháp NoSQL, bạn sẽ cần phải tính đến những hạn chế này bằng cách điều chỉnh thiết kế ứng dụng phù hợp, tức là giải quyết cả trường hợp sử dụng của bạn và kiến ​​trúc NoSQL cụ thể mà bạn đang nhắm mục tiêu.

Chúc may mắn!

+8

Cảm ơn Stefen. Bạn hoàn toàn chính xác. Không may là có một lỗi trong tài liệu nhà phát triển AWS cho thấy các toán tử này cũng có sẵn cho truy vấn. – user573306

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