【DynamoDB】增删改查(CRUD)操作概述(.NET)

2020-10-21  本文已影响0人  吃自己家大米

0、写在前面

这里主要讲一些DynamoDB的特点和查询条件的基本代码。
DynamoDB主要有两个烦人点,一个是 主键 的一大堆限制,还有一个是 查询条件 的一堆限制,看清了这两个点后,基本上就没啥了,下面我们一个一个看。

1、主键

新建表的时候可以知道DynamoDB的主键只有两种形式,一种是只有项目键(或者叫分区键)组成,一种是项目键和排序键一起组成。
另外添加数据的时候除了主键是唯一不能为空外,其他数据都是可以任意删减的。
那么它的这些特点跟关系型数据库区别还是很大的,这也造成在进行数据操作的时候有了大量的约束条件。


主键只有项目键 主键为项目键和排序键

2、查询条件

(1)新建一个测试表SunTest,主键为 IsNew和GTIN

SunTest

(2)新建一些数据

新建数据
点开详情看一下第一条,可以看到它只有 IsNew 和 GTIN 这两个属性
第一条数据 修改第一条数据-添加属性
修改第一条数据

修改后就变成了了下图所示


添加 IsError

(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,例如:

状态组合

感谢阅读,喜欢的话点个赞吧:)
更多内容请关注后续文章。。。

上一篇下一篇

猜你喜欢

热点阅读