前言
GraphQL 是一个通过 API 查询和操纵数据的开源查询语言。它可以在前端和后端之间提供一种统一的数据交换方式。MongoDB 是一个非关系型数据库,它使用文档模型存储数据。它的灵活性和可扩展性使得它成为了许多企业和开发者的首选。
在本文中,我们将介绍如何最好地将 GraphQL 和 MongoDB 结合使用,并探讨一些最佳实践。
GraphQL 和 MongoDB 的基础知识
GraphQL
GraphQL 是一种查询语言,它允许客户端指定所需数据的结构和格式。与 REST 不同,GraphQL 只需要一个端点,通过查询和变异操作,客户端可以获取和修改数据。
查询语法
GraphQL 查询由字段和参数组成。例如,以下是一个查询用户的示例:
query { user(id: 123) { name age email } }
这个查询将返回一个用户对象,其中包含该用户的名称、年龄和电子邮件。
变异语法
变异用于更新服务器上的数据。变异需要包含一个操作名称和一个输入对象。以下是一个变异用户的示例:
mutation { updateUser(input: {id: 123, name: "John", age: 30, email: "john@example.com"}) { name age email } }
这个变异用于更新 ID 为 123 的用户。它将该用户的名称、年龄和电子邮件更改为 John、30 和 john@example.com。
MongoDB
MongoDB 是一个基于文档的数据库,它使用 BJSON(二进制 JSON)格式存储数据。文档是一组键值对,其中的值可以是字符串、数字、日期、布尔值、数组或其他文档。
文档结构
MongoDB 文档结构如下:
{ "_id": ObjectId("5f4b97f0d83eac9f4375dd5c"), "name": "John", "age": 30, "email": "john@example.com" }
该文档包含一个唯一 ID、名称、年龄和电子邮件属性。唯一 ID 是 MongoDB 中每个文档的唯一标识符。
查询语法
MongoDB 查询使用查询运算符。以下是一个查询年龄大于 25 的示例:
db.users.find({age: {$gt: 25}})
这个查询将返回年龄大于 25 的所有用户。
变异语法
MongoDB 变异使用操作运算符。以下是一个更新用户的示例:
db.users.update({_id: ObjectId("5f4b97f0d83eac9f4375dd5c")}, {$set: {name: "John Jr"}})
这个变异使用 $set
操作符将 ID 为 5f4b97f0d83eac9f4375dd5c 的用户的名称更改为 John Jr。
将 GraphQL 和 MongoDB 结合使用的最佳实践
1. 设计 GraphQL 模式
首先,我们需要设计用于与 MongoDB 通信的 GraphQL 模式。在这个模式中,我们需要定义类型和字段,这些类型和字段对应于 MongoDB 中存储的文档。
例如,以下是一个用户类型的示例:
type User { _id: ID! name: String! age: Int! email: String! }
这个类型表示 MongoDB 中的用户文档。它包含 _id
、名称、年龄和电子邮件字段。
2. 构建 GraphQL API
在设计完模式后,我们需要构建一个 GraphQL API,使客户端可以查询和变异 MongoDB 中的数据。我们可以使用 Node.js 和 express-graphql 构建 GraphQL API。
-- -------------------- ---- ------- ----- ------- - ------------------- ----- - ----------- - - --------------------------- ----- - -------------------- - - --------------------------------- ----- - ----------- - - ------------------- ----- --- - ---------- ----- -------- - - ---- ---- - ---- --- ----- ------- ---- ---- ------ ------- - ---- ----- - -------- ----- ---- ------ ------ - ----- --------- - ----- ------- ---- ---- ------ ------- - ---- -------- - ----------------- ------------ ---- -------------- ---- ------ ------------ ---- -------------- ----- ---- - -- ----- --------- - - ------ - ----- ----- --- - -- -- - -- -- -- - ----- ---- - ----- -------------------------------- ---- --- ------------ --- ------ ----- -- ------ ----- --- --- - -- -- -- - ----- ----- - ----- ---------------------------------------- ------ ------ -- -- --------- - ----------- ----- --- - ----- -- - -- -- -- - ----- ------ - ----- ---------------------------------------- ----- ---- - ----- -------------------------------- ---- ----------------- --- ------ ----- -- ----------- ----- --- - --- ----- -- - -- -- -- - ----- ---------------------------------- ---- --- ------------ -- - ----- ----- --- ----- ---- - ----- -------------------------------- ---- --- ------------ --- ------ ----- -- ----------- ----- --- - -- -- - -- -- -- - ----- ---- - ----- -------------------------------- ---- --- ------------ --- ----- ---------------------------------- ---- --- ------------ --- ------ ----- -- -- -- ----- ------ - ---------------------- --------- ---------- --- ------------------------------------------------ ----- ----- ------- -- - -- ----- - ------------------- ------- - ----- -- - ------------------ -------- ----------- ------------- ------- -------- - -- -- --------- ----- -- -- ---------------- -- -- - ---------------------- -- ---- ------- --- ---
在这个示例中,我们定义了 typeDefs
和 resolvers
对象,然后使用 makeExecutableSchema
函数创建一个 GraphQL schema。然后,我们使用 MongoClient 对象连接 MongoDB,然后使用 express-graphql 中间件创建一个路由,使之可以直接访问查询和变异操作。
3. 查询和变异 MongoDB 数据
现在,我们可以使用 GraphQL 对 MongoDB 数据进行查询和变异。例如,以下是查询年龄大于 25 的所有用户的示例:
query { users(filter: {age: {gt: 25}}) { name age email } }
这个查询将返回所有年龄大于 25 的用户的名称、年龄和电子邮件。
以下是创建用户的一个示例:
mutation { createUser(input: { name: "John", age: 30, email: "john@example.com" }) { name age email } }
这个变异将创建一个名为 John 年龄为 30,电子邮件地址为 john@example.com 的用户,并返回该用户的信息。
结论
以上是 GraphQL 和 MongoDB 结合的最佳实践。通过遵循这些实践,您可以使用 GraphQL 和 MongoDB 构建一个灵活而可扩展的 API,使其可以直接访问 MongoDB 数据库。GraphQL 和 MongoDB 的结合使用,可以实现前后端的快速集成,提高开发效率,让前端工程师专注于业务逻辑的实现。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6770ee13e9a7045d0d834ae0