2015-11-21 13 views
10

tôi đang tạo ra một bảng và GSI trong dynamo, sử dụng các thông số này, theo các tài liệu:Truy vấn một Index Secondary toàn cầu trong dynamodb Local

configId là khóa chính của bảng, và tôi đang sử dụng các publisherId như . khóa chính cho GSI (tôi đã xóa một số thông số cấu hình cần thiết cho ngắn gọn)

var params = { 
    TableName: 'Configs', 
    KeySchema: [ 
     { 
      AttributeName: 'configId', 
      KeyType: 'HASH', 
     } 
    ], 
    AttributeDefinitions: [ 
     { 
      AttributeName: 'configId', 
      AttributeType: 'S', 
     }, 
     { 
      AttributeName: 'publisherId', 
      AttributeType: 'S', 
     } 
    ], 
    GlobalSecondaryIndexes: [ 
     { 
      IndexName: 'publisher_index', 
      KeySchema: [ 
       { 
        AttributeName: 'publisherId', 
        KeyType: 'HASH', 
       } 
      ] 
     } 
    ] 
}; 

tôi truy vấn bảng này sử dụng này:

{ TableName: 'Configs', 
    IndexName: 'publisher_index', 
    KeyConditionExpression: 'publisherId = :pub_id', 
    ExpressionAttributeValues: { ':pub_id': { S: '700' } } } 

nhưng tôi tiếp tục gặp lỗi: "ValidationException: Một hoặc nhiều giá trị thông số không hợp lệ: Loại thông số điều kiện không khớp với loại lược đồ"

Trong tài liệu, nó chỉ định rằng KeyType chính có thể là HASH hoặc RANGE và bạn đã đặt attributeType trong trường attributeDefinitions. Tôi đang gửi publisherId như String, không chắc chắn những gì tôi đang thiếu ở đây.

Có phải vấn đề trong cách tôi đang tạo bảng hay cách tôi đang truy vấn? Cảm ơn

+0

Tôi sẽ thực hiện cuộc gọi mô tả trên 'Xác nhận' để kiểm tra kỹ xem chỉ mục phụ đã được tạo như mong đợi chưa. –

Trả lời

33

Cố gắng thay đổi điều này

{ 
TableName: 'Configs', 
IndexName: 'publisher_index', 
KeyConditionExpression: 'publisherId = :pub_id', 
ExpressionAttributeValues: { ':pub_id': { S: '700' } } 
} 

trong này

{ 
TableName: 'Configs', 
IndexName: 'publisher_index', 
KeyConditionExpression: 'publisherId = :pub_id', 
ExpressionAttributeValues: { ':pub_id': '700'} 
} 

Từ { ':pub_id': { S: '700' } }-{ ':pub_id': '700'}.

Tôi đã gặp vấn đề tương tự và tôi đã dành 2 ngày cho việc này. Các tài liệu chính thức gây hiểu lầm.

+0

Xin lỗi, tôi đã thử điều này nhưng nó không hoạt động cho tôi. Khi tôi không cung cấp thứ gì đó với kiểu dữ liệu, như trong: {': pub_id': {S: '700'}}, tôi gặp lỗi xác thực. Bạn có chắc chắn bạn không nói về ExpressionAttributesNames thay vì ExpressionAttributesValues? –

+0

Từ khóa chính xác là 'ExpressionAttributeValues' và không phải Thuộc tính. Bạn có chắc chắn rằng ValidationException của bạn không được chuyển sang lỗi nhỏ này? Trong trường hợp của tôi, tôi không sử dụng tham số 'ExpressionAttributeNames' và nó hoạt động. – gior91

+0

@ gior91 Cool! Điều này thực sự đã giúp tôi. Cảm ơn! – ckuijjer

0

Hãy thử thay thế JSON truy vấn của bạn với điều này:

{ 
    TableName: 'Configs', 
    IndexName: 'publisher_index', 
    KeyConditionExpression: '#publisherId = :pub_id', 
    ExpressionAttributeNames: { '#publisherId': 'publisherId' }, 
    ExpressionAttributeValues: { ':pub_id': { 'S': '700' } } 
} 
2

Hóa ra nó phụ thuộc vào việc bạn sử dụng AWS.DynamoDB hoặc AWS.DynamoDB.DocumentClient.

Kiểm tra sự khác biệt trong tài liệu hướng dẫn: AWS.DynamoDB.query vs AWS.DynamoDB.DocumentClient.query

Trong DocumentClient doc nêu rõ:

The document client simplifies working with items in Amazon DynamoDB by abstracting away the notion of attribute values. This abstraction annotates native JavaScript types supplied as input parameters, as well as converts annotated response data to native JavaScript types.

...

Supply the same parameters as AWS.DynamoDB.query() with AttributeValues substituted by native JavaScript types.

Có lẽ bạn nơi cũng đề cập đến DynamoDB API Reference mà trong thực tế làm cho không có giả định về SDK đã sử dụng nhưng sử dụng các Yêu cầu HTTP đơn giản trong các ví dụ.

Do đó, sử dụng AWS.DynamoDB.DocumentClient bạn sẽ chỉ cung cấp bản đồ khóa-giá trị đơn giản cho ExpressionAttributeValues theo đề xuất của @ gior91.

3

Như đã nêu ở trên, bạn cần sử dụng Máy khách tài liệu DynamoDB nếu bạn muốn loại bỏ việc truyền kiểu.

var docClient = new AWS.DynamoDB.DocumentClient(); 

... thì bạn chỉ có thể sử dụng ký hiệu đối tượng được liệt kê ở trên để gọi API.

{ ':pub_id': '700'} 

Tự mình sử dụng DynamoDB() ở một số nơi và docClient ở những nơi khác, không thể tìm ra trong một thời gian, nhưng điều đó sẽ giải quyết được.

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