0、写在前面
这里主要讲一些DynamoDB的特点和查询条件的基本代码。
DynamoDB主要有两个烦人点,一个是 主键 的一大堆限制,还有一个是 查询条件 的一堆限制,看清了这两个点后,基本上就没啥了,下面我们一个一个看。
1、主键
新建表的时候可以知道DynamoDB的主键只有两种形式,一种是只有项目键(或者叫分区键)组成,一种是项目键和排序键一起组成。
另外添加数据的时候除了主键是唯一不能为空外,其他数据都是可以任意删减的。
那么它的这些特点跟关系型数据库区别还是很大的,这也造成在进行数据操作的时候有了大量的约束条件。
2、查询条件
(1)新建一个测试表SunTest,主键为 IsNew和GTIN
(2)新建一些数据
点开详情看一下第一条,可以看到它只有 IsNew 和 GTIN 这两个属性
修改后就变成了了下图所示
(3)Query查询语句
● 查询非新数据 IsNew=0
从下面代码中可以看到 ExpressionAttributeValues 中的 :IsNew 相当于条件表达式的变量值,当然冒号:后面的变量名是随便起的,这里为了方便就直接用了同名,KeyConditionExpression 则是具体的查询条件。特别需要注意的是,DynamoDB规定 KeyConditionExpression 中只能有 分区键(partition key)和 排序键(sorted key)这两个属性的条件,而且必须 要有分区键(partition key)的 等式 条件,至于排序键(sorted key)在 KeyConditionExpression 中则可有可无。
public class Function
{
private static AmazonDynamoDBClient client = new AmazonDynamoDBClient();
public string FunctionHandler()
{
string pro="";
try {
var request = new QueryRequest
{
TableName = "SunTest",
KeyConditionExpression = "IsNew = :IsNew",
ExpressionAttributeValues = new Dictionary<string, AttributeValue> {
{":IsNew", new AttributeValue{N="0"} }
}
};
var response = Task.Run(async () =>
{
QueryResponse res = await client.QueryAsync(request);
return res;
});
var varResult = Task.WhenAll(response).Result;
foreach (Dictionary<string, AttributeValue> item in varResult[0].Items)
{
pro = pro + PrintItem(item);
}
} catch (Exception e) {
Console.WriteLine(e);
pro = "error";
}
return pro;
}
private static string PrintItem(Dictionary<string, AttributeValue> attributeList)
{
string pro = "";
foreach (KeyValuePair<string, AttributeValue> kvp in attributeList)
{
string attributeName = kvp.Key;
AttributeValue value = kvp.Value;
//Number
if (attributeName == "IsNew"|| attributeName == "IsError")
{
pro = pro + "\"" + attributeName + "\":\"" + string.Join(",", value.N) + "\",";
}
//String
else
{
pro = pro + "\"" + attributeName + "\":\""+value.S+"\",";
}
}
if (pro.Length>0)
{
pro = "{" + pro.Substring(0, pro.Length - 1) + "}";
}
return pro;
}
}
● 过滤非新数据中的错误数据 IsNew=0,IsError=1
需要注意的是 FilterExpression 这个表达式不是Query到数据库的查询条件,只是在查询返回结果中的一个过滤。那么我们真正要查询错误数据出来的话,就要用到DynamoDB的另一个概念索引了。
var request = new QueryRequest
{
TableName = "SunTest",
KeyConditionExpression = "IsNew = :IsNew",
+ FilterExpression = "IsError = :IsError",
ExpressionAttributeValues = new Dictionary<string, AttributeValue> {
{":IsNew", new AttributeValue{N="0"} },
+ {":IsError", new AttributeValue{N="1"} }
}
};
3、索引
由于主键的限制,在需要查询很多不同数据类型的时候,就需要用到不同的属性条件,DynamoDB提供了 索引 来支持这样的功能。不过,DynamoDB的一张表还规定了最多只能有五个索引,所以遇到这些相对复杂数据要求的时候,DynamoDB数据表的数据索引结构方面的设计尤其废脑筋。
这里需要注意的是,名字可以为任意属性名,甚至是主表里没有的字段。
每建一个索引都要钱,这里截图看下之前别的项目里建的索引
建了 IsError 索引后,查询语句就可以这么写了
var request = new QueryRequest
{
TableName = "SunTest",
- KeyConditionExpression = "IsNew = :IsNew",
+ IndexName= "IsError-index",
+ KeyConditionExpression = "IsError= :IsError",
ExpressionAttributeValues = new Dictionary<string, AttributeValue> {
- {":IsNew", new AttributeValue{N="0"} },
{":IsError", new AttributeValue{N="1"} }
//{":LastModified", new AttributeValue{S="2020-10-14T00:12:42.849Z"} }
}
};
写到这里发现,最多也就两个条件,如果是多状态的数据我们应该就不好处理了,这里建议将状态组合成一个数组字符串作为partition key或者sort key,例如:
感谢阅读,喜欢的话点个赞吧:)
更多内容请关注后续文章。。。