自从Parse.com服务宣布关闭后,我决定使用Amazon Web Services重建我的应用程序。据我所知,Parse使用NoSQL(MongoDB)数据库,我能够在Parse仪表板中设置一对多的关系。
我成功创建了一个带有哈希"Post"
:
"_id"
{
"_id":"1"
}
和表格"Comment"
包含哈希"_id"
和范围"post_id"
:
{
"_id":"1",
"post_id":"1",
"text":"my comment"
}
现在,我想获取帖子_id = 1
以及与此帖相关的所有评论。实现这个的基本方法是什么?我想定义一个Lambda函数,它将对DynamoDB进行两次查询:
设计一对多关系是否有效?
答案 0 :(得分:1)
根据您的设计,您将遇到的一个问题是能够通过post_id
查询评论表。 DynamoDB要求您在进行查询时提供哈希键值,因此使用DynamoDB实际上在关系数据库(例如连接)中微不足道的事情变得相当困难。
您尝试缓解此问题的一种方法是在评论表上创建GSI(全局二级索引),并在post_id
上创建分区键。
另一个选项是使评论表中的哈希键为post_id
,范围键为comment_id
或timestamp
。
我希望这会有所帮助,但如果您仍有疑问,我建议您通过Forums.
与亚马逊客户支持联系答案 1 :(得分:0)
正如我所承诺的,发布我的lambda函数来获取"关系"你的帖子。它实例化一个dynamodb实例,并使用您提供的参数进行查询。简而言之,您需要在ExpressionAttributeValues post_id
中提供您感兴趣的评论。
var AWS = require('aws-sdk');
exports.handler = (event, context, callback) => {
var dynamodb = new AWS.DynamoDB();
var comment_params = {
"TableName": "YOUR_TABLE_NAME",
"Select":"ALL_ATTRIBUTES",
"IndexName": "YOUR_GLOBAL_INDEX",
"Limit": 10,
"ConsistentRead": false,
"KeyConditionExpression": "#post_id = :v1",
"ExpressionAttributeValues": {
":v1": {"S": "POST_ID"}
},
"ExpressionAttributeNames": {"#post_id": "post_id"},
"ReturnConsumedCapacity": "TOTAL"
}
dynamodb.query(comment_params, function(err, data) {
if (err) {
return callback(err);
} else {
var comment_items = data.Items;
return callback(null, comment_items);
}
}
}