AWSドキュメントを確認しましたが、実用的な例は見つかりませんでした。
これが私の試みです
var params = {
TableName: "User",
IndexName:"a-b-index",
KeyConditionExpression: "Country = :country and #s = :status",
FilterExpression: "Id IN (:e)",
ExpressionAttributeValues: {
":country ": "USA",
":status": 1,
":e": "1"
},
ExpressionAttributeNames: {"#s": "Status"}
};
//get users
dynamodb.query(params, function (err, data) {
if (err)
//error
else {
//success
}
});
レコードを取得しましたが、IDが1
のレコードを取得していますが、このような配列を使用したいです
var params = {
TableName: "User",
IndexName:"a-b-index",
KeyConditionExpression: "Country = :country and #s = :status",
FilterExpression: "Id IN (:e)",
ExpressionAttributeValues: {
":country ": "USA",
":status": 1,
":e": ["1","2","3"]
},
ExpressionAttributeNames: {"#s": "Status"}
};
//get users
dynamodb.query(params, function (err, data) {
if (err)
//error
else {
//success
}
});
上記のコードをworking.wantとして作成してレコードを取得するにはどうすればよいですか?構文は正しく、クエリはエラーなしで実行されますが、レコードが取得されません
これを参照してください answer
概要:-
「IN」句の値の数が固定の場合:-
var params = {
TableName : "Users",
FilterExpression : "username IN (:user1, :user2)",
ExpressionAttributeValues : {
":user1" : "john",
":user2" : "mike"
}
};
配列の要素を増やし、動的にFilterExpressionを形成する場合:-
var titleValues = ["The Big New Movie 2012", "The Big New Movie"];
var titleObject = {};
var index = 0;
titleValues.forEach(function(value) {
index++;
var titleKey = ":titlevalue"+index;
titleObject[titleKey.toString()] = value;
});
var params = {
TableName : "Movies",
FilterExpression : "title IN ("+Object.keys(titleObject).toString()+ ")",
ExpressionAttributeValues : titleObject
};
notionquest の答えは正しいですが、ExpressionAttributeValues
の他の値を:country
や:status
のように使用できないので、ここで変更して、正常に機能するようにします私の要件
var AttributeValuesObject = {};
AttributeValuesObject[':country '] = "USA";
AttributeValuesObject[':status'] = 1;
var titleValues = ["1", "2"];
var titleObject = {};
var index = 0;
titleValues.forEach(function(value) {
index++;
var titleKey = ":titleValue"+index;
AttributeValuesObject[titleKey.toString()] = value;
titleObject[titleKey.toString()] = value;
});
var params = {
TableName: "User",
IndexName:"a-b-index",
KeyConditionExpression: "Country = :country and #s = :status",
FilterExpression: "Id IN ("+Object.keys(titleObject).toString()+ ")",
ExpressionAttributeValues: AttributeValuesObject,
ExpressionAttributeNames: {"#s": "Status"}
};
//get users
dynamodb.query(params, function (err, data) {
if (err)
//error
else {
//success
}
});
私はこのようにして、paramsリストを一度解析しました
const users = [{userId:1, name:'joe'}, {userId:2, name:'mike'}]
const expressionAttributeValues = {};
const userIdParams = users.map((u, i) => {
const userParam = `:user${i}`;
expressionAttributeValues[userParam] = u.userId;
return userParam;
}).join(',')
var params = {
TableName : 'Users',
FilterExpression : `username IN (${userIdParams})`,
ExpressionAttributeValues : expressionAttributeValues
};
Notionquestのアプローチを使用して、titleObject{}
内に他の属性値を挿入することもできます。例えば.
var titleObject = { ": country": "USA", ":status": 1, };
注:DocumentClientを使用していない場合は、「S」などのスキーマを追加する必要がある場合があります。
var titleObject = {
":country": { "S":"USA" }, ...
}
Es5とマップを使用:
const params = {
TableName: 'personalizations',
KeyConditionExpression: 'accountId = :accountId',
FilterExpression: `websiteId IN (${websites.map(w => `:${w.websiteId}`).join(',')})`,
ExpressionAttributeValues: {':accountId': accountId}
}
for (const website of websites) {
params.ExpressionAttributeValues[`:${website.websiteId}`] = website.websiteId
}
const {Items: personalizations} = await docClient.query(params).promise()