Dgraph 入门教程六《增删改查》

作为入门教程,本章是最后一章教程,Dgraph 还有很多东西可以介绍,如果有时间,后面在出Dgraph的进阶教程。对数据库最重要的操作就是增删改查。本章将详细介绍。

1、查询

Dgraph 在你创建GraphQL的时候会自动创建查询。查询用的是Queries。

比如创建

type Post {id: ID!title: String! @searchtext: Stringscore: Float @searchcompleted: Boolean @searchdatePublished: DateTime @search(by: [year])author: Author!
}type Author {id: ID!name: String! @searchposts: [Post!]friends: [Author]
}

下面的查询会自动创建

getPost(postID: ID!): Post
queryPost(filter: PostFilter, order: PostOrder, first: Int, offset: Int): [Post]
aggregatePost(filter: PostFilter): PostAggregateResult

第一个查询根据ID获取数据,第二个查询允许你根据一些过滤条件,排序查询数据,第三个查询允许你获得一些聚合参数。

执行下面的语句让你获取Post和关联对象

query {getPost(id: "0x1") {idtitletextdatePublishedauthor {namefriends {name}}}
}

你也可以通过Author去查询Post 甚至可以对Post在添加查询过滤条件

query {getAuthor(id: "0x1") {nameposts(filter: {title: {allofterms: "GraphQL"}}) {titletextdatePublished}}
}

注意,这些查询支持哪些查询还去觉得定义Shema的时候给的条件,比如tile 后面的指令 @search。

Dgraph 支持一些聚合查询,比如获取Post的数量

   query {aggregatePost {count}}

聚合查询时,也可以加入一些判断条件

   query {aggregatePost(filter: {title: {anyofterms: "GraphQL"}}) {count}}

也可以对子节点做高级聚合查询。比如

   query {queryAuthor {namepostsAggregate {scoreMinscoreMaxscoreAvg}}}

支持 And,Or和Not,类似下面的语句

queryPost(filter: {title: { allofterms: "GraphQL"},or: { title: { allofterms: "Dgraph" } }
} ) { ... }

支持排序和分页

queryPost(order: { desc: datePublished, then: { desc: numLikes } }, first: 5) { ... }

@cascade 指定可以去除不必要的字段。@skip和@include 可以对语句传入需要的参数。skip和include 是反的。

query ($skipTitle: Boolean!) {queryPost {idtitle @skip(if: $skipTitle)text}
}

查询之前在云平台测试过,这里就不作演示了,可以自己去测试。

2、增,删,改

和查询不同,增删改用的是Mutations。和查询一样,在创建Shema 的时候,下面的Mutaion的将被自动创建

type Mutation {addAuthor(input: [AddAuthorInput!]!): AddAuthorPayloadupdateAuthor(input: UpdateAuthorInput!): UpdateAuthorPayloaddeleteAuthor(filter: AuthorFilter!): DeleteAuthorPayloadaddPost(input: [AddPostInput!]!): AddPostPayloadupdatePost(input: UpdatePostInput!): UpdatePostPayloaddeletePost(filter: PostFilter!): DeletePostPayload
}type AddAuthorPayload {author(filter: AuthorFilter, order: AuthorOrder, first: Int, offset: Int): [Author]numUids: Int
}type AddPostPayload {post(filter: PostFilter, order: PostOrder, first: Int, offset: Int): [Post]numUids: Int
}type DeleteAuthorPayload {author(filter: AuthorFilter, order: AuthorOrder, first: Int, offset: Int): [Author]msg: StringnumUids: Int
}type DeletePostPayload {post(filter: PostFilter, order: PostOrder, first: Int, offset: Int): [Post]msg: StringnumUids: Int
}type UpdateAuthorPayload {author(filter: AuthorFilter, order: AuthorOrder, first: Int, offset: Int): [Author]numUids: Int
}type UpdatePostPayload {post(filter: PostFilter, order: PostOrder, first: Int, offset: Int): [Post]numUids: Int
}

里面涵盖了三个操作:增加 Add,删除deleta 和改 update。

2.1、Add

用add 添加的时候,会自动创建input 类型。下面是自动创建的input 类型和添加一个对象的示例

input AddAuthorInput {name: String!dob: DateTimeposts: [PostRef]
}mutation {addAuthor(input: {name: "A.N. Author",lastName: "2000-01-01",}){...}
}

Dgraph 可以一次执行多个添加,且是互不影响的

mutation ($post: AddPostInput!, $author: AddAuthorInput!) {addAuthor(input: [$author]) {author {name}}addPost(input: [$post]) {post {postIDtitletext}}
}

在云平台中应用Schema后,打开GraphQL,在Explorer里面可以看到下面的自动创建的Mutation,在中间输入输入我们的查询语句,点击运行,右侧可以看到添加成功。

我们可以在云平台中用变量的方式测试,输入语句和变量如下

mutation addAuthor($author: [AddAuthorInput!]!) {addAuthor(input: $author) {author {idname}}
}
//变量的写法一
{ "author":[{ "name": "A.N. Author","dob": "2000-01-02","posts": []}]
}
//变量的写法二
{ "author":[{ "name": "A.N. Author","dob": "2000-01-02","posts": []}]
}

如下,其中红框内输入变量,按照$author的原型是一个数组,变量的上面两种写法都是可以的。

如果想知道在代码中如何写,请查看Dgraph 入门教程四(开发环境的搭建)-CSDN博客

2.2 、update

update的原型如下

updatePost(input: UpdatePostInput!): UpdatePostPayloadinput UpdatePostInput {filter: PostFilter!set: PostPatchremove: PostPatch
}type UpdatePostPayload {post(filter: PostFilter, order: PostOrder, first: Int, offset: Int): [Post]numUids: Int
}

先验证下set和remove。在验证之前,先增加下面两条两条post

mutation {addPost(input: {text: "A.N. Author", title: "test"}){post{postID,text,title}}}
mutation {addPost(input: {text: "A.N. Author1", title: "test"}){post{postID,text,title}}}

添加完成后,可以通过Data Studio 去查看,可以看到Post 里面已经有两个对象,红框中是我们需要记住ID,用于后面的更新。

用带变量的验证set,输入下面的语句和变量

语句:

mutation updatePost($patch: UpdatePostInput!) {updatePost(input: $patch) {post {postIDtitletext}}
}

变量


{ "patch":{ "filter": {"postID": ["0xfffd8d7297c0de0e", "0xfffd8d7297c0de0f"]},"set": {"text": "updated text"}}
}

输入执行界面

查看数据,可以看到text已经变了。这个就是根据id更新text

如果想要删除text 属性 ,我们可以执行remove。如下

语句

mutation updatePost($patch: UpdatePostInput!) {updatePost(input: $patch) {post {postIDtitletext}}
}

变量

{ "patch":{ "filter": {"postID": ["0xfffd8d7297c0de0e", "0xfffd8d7297c0de0f"]},"remove": {"text": "updated text"}}
}

结果,可以看到已经只有title了。这里的remove 是对属性控制了。

2.3、delete

删除的原型

deleteAuthor(filter: AuthorFilter!): DeleteAuthorPayloadtype DeleteAuthorPayload {author(filter: AuthorFilter, order: AuthorOrder, first: Int, offset: Int): [Author]msg: StringnumUids: Int
}

删除示例

语句:

mutation deleteAuthor($filter: AuthorFilter!) {deleteAuthor(filter: $filter) {msgauthor {namedob}}
}

变量

{ "filter":{ "name": { "eq": "A.N. Author" } }
}

验证:

删除之前:

删除之后:

因为都是一个名字,所以全部删除了。

另外可以用Upsert 去增加,更新,如果有就更新,如果没有则直接添加,是个二合一的操作。还可以用deep 父子节点一起操作,需要的可以自己去云平台上测试,这里就不做演示了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/529087.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

点读机女孩是因代言了广告而走红的吗?只知道高君雨这一点你就错了!

点读机女孩是因代言了广告而走红的吗?只知道高君雨这一点你就错了! 高君雨,就是那个在点读机广告里,甜美地说着“哪里不会点哪里,so easy”的小女孩。当年的广告一播出,这小女孩就火了,因为她聪…

JavaScript简单数组方法

一些简单的数组方法 ● 切片(不会改变原有数组) let arr [a, b, c, d, e];console.log(arr.slice(2));● 拼接(会改变原有数组) console.log(arr.splice(2)); console.log(arr);● 反转(会改变原有数组&#xff09…

友嘉电器全新一代空气除菌洗碗机系列新品发布会

2024年3月8号,在绍兴古城 咸亨酒店,友嘉电器隆重举行了一场重新定义厨房清洁标准的新品发布会。本次发布会的主题是“不是所有的洗碗机都能空气除菌” 在当今社会,厨房已经不再是简单的烹饪场所,而是与家庭生活健康息息相关的重要…

Django高级之-缓存

Django高级之-缓存 一 缓存介绍 在动态网站中,用户所有的请求,服务器都会去数据库中进行相应的增,删,查,改,渲染模板,执行业务逻辑,最后生成用户看到的页面. 当一个网站的用户访问量很大的时候,每一次的的后台操作,都会消耗很多的服务端资源,所以必须使用缓存来减轻后端服务…

阿里云k8s环境下,因slb限额导致的发布事故

一、背景 阿里云k8s容器,在发布java应用程序的时候,客户端访问出现500错误。 后端服务是健康且可用的,网关层大量500错误请求,slb没有流入和流出流量。 经过回滚,仍未能解决错误。可谓是一次血的教训,特…

AI PC:重塑未来办公与生活方式的革命性工具

随着科技的飞速发展,人工智能(AI)已经渗透到我们生活的方方面面。而在PC领域,一场由AI引领的变革也正在悄然发生。从硬件到软件,从云端到终端,AI正在重塑我们的办公和生活方式。 AI工具网 | 人工智能工具推…

EVE-NG桥接虚拟网卡实现与虚拟机通讯

一、知识补充 1、VMware网络连接 在VM中,给我们提供了以下几种连接网络的模式 桥接模式:直接联机物理网络NAT模式:用于共享主机的IP地址仅主机模式:与主机共享的专用网络自定义:特定虚拟网络LAN区段 特别注意的是&am…

学会这7种SQL进阶用法,让你少走99%的弯路!

引言 在日常业务开发中,熟练掌握SQL语言是至关重要的。除了基础的增删改查操作外,了解和掌握一些进阶的SQL用法能够让你更高效地处理各种复杂的数据操作。本文将介绍几种SQL进阶用法,让你少走99%的弯路,提高数据处理效率。 自定…

ArcGIS JSAPI 学习教程 - ArcGIS Maps SDK for JavaScript 不同版本4.8-4.28(最新版)离线部署

ArcGIS JSAPI 学习教程 - ArcGIS Maps SDK for JavaScript 不同版本4.8-4.28(最新版)SDK离线部署 测试资源4.18 以及之前版本4.19 以及之后版本 接触一段时间 ArcGIS JSAPI 之后,整体感觉还好,后来需要解决不同版本问题&#xff0…

前端解决跨域问题( 6种方法 )

本专栏是汇集了一些HTML常常被遗忘的知识,这里算是温故而知新,往往这些零碎的知识点,在你开发中能起到炸惊效果。我们每个人都没有过目不忘,过久不忘的本事,就让这一点点知识慢慢渗透你的脑海。 本专栏的风格是力求简洁…

Springboot整合Mybaits启动过程

Springboot整合Mybaits启动过程 1.前言2.MybatisAutoConfiguration3.SqlSessionFactoryBean3.1 XMLConfigBuilder.parse()3.1.1 XMLMapperBuilder.parse()3.1.1.1 XMLStatementBuilder.parse() 4.SqlSession4.1 Executor 1.前言 直接加载mybatis配置文件,然后创建S…

亚马逊店铺解决和预防订单下滑的技巧

1. 保持账号的良好表现。不要销售侵权产品,发货要及时,能有追踪号的就带可查询追踪号,能发FBA的就通过FBA发货。 2. 持续做好产品优化工作,及时留意大环境的变化和平台政策变动。遇到编辑权限受限,可开case咨询或申请…