美文网首页
【DynamoDB】增删改查(CRUD)操作概述(.NET)

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

作者: 吃自己家大米 | 来源:发表于2020-10-21 12:25 被阅读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,例如:

    状态组合

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

    相关文章

      网友评论

          本文标题:【DynamoDB】增删改查(CRUD)操作概述(.NET)

          本文链接:https://www.haomeiwen.com/subject/iohsmktx.html