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 제한이라든지 늘어나는 것이 아닐까?
Reference
이 문제에 관하여(DynamoDB 테이블에서 node.js로 무작위로 Item을 가져옵니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/atomyah/items/206a184ee789ba246466
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
// 接続詞は省略
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)
}
});
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をオブジェクト化する
}
})
}
Reference
이 문제에 관하여(DynamoDB 테이블에서 node.js로 무작위로 Item을 가져옵니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/atomyah/items/206a184ee789ba246466텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)