DynamoDB 테이블에서 node.js로 무작위로 Item을 가져옵니다.

DynamoDB 테이블에서 무작위로 항목을 가져 오는 방법



예를 들어 총수 10개의 레코드가 있는 다음과 같은 샘플 테이블에서 임의로 1건 가져오는 경우,

샘플 테이블:


RDB라면 SQL문 1행으로 끝나네요.select HAIKU from sample order by rand() limit 1
이것을 사용하여 Node.js로 코드를 작성하면,
// 接続詞は省略

  connection.query('select HAIKU from sample order by rand() limit 1', function(err, rows) {
    if(err) {
      return console.log(err)
    }else{
      HAIKU = rows[0].HAIKU
      console.log(HAIKU)
    }
  });


오 간단

그럼, NoSQL의 DyanamoDB에서는 어떻게 합시다・・・

의외로 무츠카시이 방법으로 여러분 고전하고 있는 것 같기 때문에 이것으로 좋지 않다는, 라고 하는 방법을 실어 둡니다.
var AWS = require('aws-sdk');
var docClient = new AWS.DynamoDB.DocumentClient();
var util = require('util');

    // DynamoDBのsampleテーブルをScanしItem総数を獲得
    var params = {
        TableName: 'sample',
        Select: "COUNT" // Selectはアイテム総数を返すパラメーター
    };

    docClient.scan(params, function(err, data){
        if(err){
              console.log(err);
        }else{
            util.inspect(data,false,null);
            var length = data["Count"];  //data["Count"]に全Item数が入ります
            randomNum = Math.floor(Math.random() * length);
            console.log('randomNumは ' + randomNum);
            callHAIKU(randomNum);
        }
    });



    // ランダム整数randomNumを引数にsampleテーブルからランダムにHAIKU文字列を獲得
    function callHAIKU(arg){
        var randomNum = arg;
        var params = {
            TableName: 'sample',
            Key: {            // SQLのwhere条件文にあたるパラメーター
                'ID': randomNum
            }
        };
        docClient.get(params, function(err,data) {
            if(err){
                console.log(err);
            }else{
                var result = JSON.stringify(data.Item)  
                //data.ItemはJSON文字列の{"ID":3,"HAIKU":"春雨や食はれ残りの鴨が鳴く"}
                var result = JSON.parse(result.HAIKU);            
                //parseしてresultをオブジェクト化する
            }
        })
    }


Scan에서 총 건수를 먼저 가져와서 그것을 var length에 저장.
그것을 사용하여
randomNum = Math.floor(Math.random() * length)
의 식으로 1~10까지의 랜덤인 정수를 randomNum 변수에 격납.

randomNum 변수를 인수로 사용하여 callHAIKU() 함수에서 HAIKU 문자열을 가져옵니다.
궁극적으로 result 변수에 하이쿠의 부분만, 예를 들면 "봄비나 먹어 남은 오리가 울린다"가 저장됩니다.

이 문자열을 랜덤하게 트윗하거나 라인으로 매일 아침 일제 메시지 하거나 하는 사용법.

다만,

DynamoDB에서는 한 번의 Scan에 1MB의 제한이 있으므로 주의. 테이블의 사이즈가 크면 전건수가 취해 이것이 아닙니다.

단지 상기와 같은 간소한 테이블로 10 레코드라면 3KB도 없기 때문에 그 300배 정도의 사이즈까지 괜찮다. (3,000레코드라든지)

게다가, 1MB 제한도 그 중 1GB 제한이라든지 늘어나는 것이 아닐까?

좋은 웹페이지 즐겨찾기