2017-06-20 15 views
1

dynamodb.scan()から約束を受け取ります。レスポンスにLastEvaluatedKeyが含まれていると約束が解決されると、dynamodb.scan()を再度呼び出さなければなりません。レスポンスにLastEvaluatedKeyオブジェクトが含まれていない場合は、テーブルのすべてのレコードがスキャンされ、クエリが完了します。私は事前に必要なscan()呼び出しの回数を知らない。私はこれをコード化する方法を知らない。これは今私が持っているものです:dynamodbスキャンを複数回呼び出して約束を使用する方法

function scan(options, startKey) { 
    var parms = { 
    TableName: options.source, 
    ProjectionExpression: "book, bid, #kee, #unt, pid, #txt", 
    FilterExpression: "contains(#txt, :v_qs)", 
    ExpressionAttributeNames: { 
     "#unt": "unit", 
     "#txt": "text", 
     "#kee": "key" 
    }, 
    ExpressionAttributeValues: { 
     ":v_qs": options.queryTransformed 
    } 
    }; 

    if (startKey) { 
    parms.ExclusiveStartKey = startKey; 
    } 

    return dynamoDb.scan(parms).promise(); 
} 

scan(options).then(function(response) { 
    if (response.LastEvaluatedKey) { 
    searchResults.push(response); 
    return scan(options, response.LastEvaluatedkey); 
    } 
    else { 
    return response 
    } 
}).then(function(response) { 
    if (response.LastEvaluatedKey) { 
    searchResults.push(response); 
    return scan(options, response.LastEvaluatedKey); 
    } 
    else { 
    return response; 
    } 
}).then(function(response) { 
    //this is crazy - bailing even if another call is needed 
    searchResults.push(response); 
    return generateSearchResponse(); 
}); 

これは明らかにそれを行う方法ではありません。このコードは、AWSラムダノード関数の一部です。あなたの助けを前にありがとう。

答えて

0

再帰関数はあなたの友人である必要があります。私は自分でそれをテストすることはできませんが、このようなものはうまくいくはずです。エラーが発生した場合はお知らせください

function scan(options, startKey) { 
    var parms = { 
    TableName: options.source, 
    ProjectionExpression: "book, bid, #kee, #unt, pid, #txt", 
    FilterExpression: "contains(#txt, :v_qs)", 
    ExpressionAttributeNames: { 
     "#unt": "unit", 
     "#txt": "text", 
     "#kee": "key" 
    }, 
    ExpressionAttributeValues: { 
     ":v_qs": options.queryTransformed 
    } 
    }; 

    if (startKey) { 
    parms.ExclusiveStartKey = startKey; 
    } 

    return dynamoDb.scan(parms).promise(); 
} 

function processResponse(options, response) { 
    return (response && response.LastEvaluatedKey) ? 
     scan(options, response.LastEvaluatedkey) 
      .then(function(next_response) { 
       return [response].concat(processResponse(next_response)); 
      }) 
     : 
     Promise.resolve(response); // replace 'Promise' by whatever Promise library you are using (when, bluebird, ...) 
} 

scan(options) 
    .then(processResponse.bind(null, options)) 
    .then(function(response_list) { 
     // response_list is an array of response 
     return generateSearchResponse(); 
    }); 
関連する問題