递归获取所有项目在DynamoDB使用节点JS递归、节点、项目、DynamoDB

2023-09-11 11:23:14 作者:只要你要,只要我有

这是可能更多的JS /异步的问题不是DynamoDB具体的问题 -

我想获取与亚马逊DynamoDB散列关键字表中的所有项目。该表也有它的范围键。

我使用的是NodeJS库,它是围绕AWS DynamoDB REST API的包装。 - 节点DynamoDB

DynamoDB只返回1 MB值得每个查询的结果。若要获取结果的提醒,它包括的 lastEvaluatedKey 。我们可以将此在另一个查询获取另一1 MB价值的结果等等...

我在写一个递归异步函数,它应该打的服务顺序,直到我可以拿回所有的结果遇到困难。 (表将永远不会有超过10 MB的我的使用情况下,没有机会失控查询)

一些伪$ C $下图:

  ddb.query(产品,PrimaryKey的,{},功能(错了,结果){
    //检查ERR
    如果(结果和安培;&安培; result.lastEvaluatedKey){
        //再次运行查询
        VAR TEMPSET = result.items;
        //临时存储result.items,所以我们可以继续获取剩余项目。
    }
    其他{
        VAR finalSet = result.items;
        //弄清楚如何与之前获取的项目进行合并。
    }
});
 

解决方案

伪code:

  VAR GETALL =功能(PrimaryKey的,CB)
    {
        VAR finalSet = [],
            查询=函数(列克)
            {
                ddb.query(产品,PrimaryKey的,{exclusiveStartKey:列克},功能(错了,结果)
                {
                    如果(ERR)返程CB(ERR);

                    如果(result.items.length)
                      finalSet.push.apply(finalSet,result.items);

                    如果(result.lastEvaluatedKey)
                      查询(result.lastEvaluatedKey);
                    其他
                      CB(NULL,finalSet);
                });
            };

        查询();
    };


GETALL(PrimaryKey的,功能(ERR,全部)
{
    的console.log(错了,所有的);
});
 
递归 Javascript

This is probably more of an JS/Async question than a DynamoDB specific question -

I want to fetch all the items in a table with a hash key in Amazon's DynamoDB. The table also has Range key in it.

I am using a NodeJS library which is a wrapper around AWS DynamoDB REST API. - Node-DynamoDB

DynamoDB only returns 1 MB worth of results with each query. To fetch reminder of results, it includes lastEvaluatedKey . We can include this in another query to fetch another 1 MB worth of results and so on...

I am facing difficulty in writing a recursive async function which should hit the service sequentially till i can get all the results back. (table will never have more than 10 MB for my use case, no chance of a runaway query)

Some pseudo code for illustration:

ddb.query('products', primarykey, {}, function(err,result){
    //check err
    if(result && result.lastEvaluatedKey){
        //run the query again
        var tempSet = result.items;
        //temporarily store result.items so we can continue and fetch remaining items.
    }
    else{
        var finalSet = result.items;
        //figure out how to merge with items that were fetched before.
    }
});

解决方案

pseudocode:

var getAll= function (primarykey,cb)
    {    
        var finalSet= [],
            query= function (lek)
            {
                ddb.query('products', primarykey, { exclusiveStartKey: lek }, function(err,result)
                {   
                    if (err) return cb(err);

                    if (result.items.length)
                      finalSet.push.apply(finalSet,result.items);

                    if (result.lastEvaluatedKey)
                      query(result.lastEvaluatedKey);
                    else
                      cb(null,finalSet);
                });
            };

        query();
    };


getAll(primarykey,function (err, all)
{
    console.log(err,all);
});