FaunaDB使用

FaunaDB使用

1 注册


进入FuanaDB官网进行注册:

FaunaDBSignup.png


2 创建数据库


FaunaDBview.png


3 创建数据集合与索引


类似于数据库的Table,FaunaDB使用集合概念,索引可方便对数据集合进行查找等操作。

FaunaCollectionAndIndex.png


4 FQL查询语言


FaunaDB提供原生查询语言,简称FQL(Fauna Query Language),用法可见FQL使用

如查找People集合中,名字为特定值的记录:

(1) 创建索引


CreateIndex({
  name: "people_search_by_first",
  source: Collection("People"),
  terms: [
    {
      field: ["data", "first"]
    }
  ]
})

(2) 遍历所有


Map(
  Paginate(
    Match(Index("people_search_by_first"), "Alan")
  ),
  Lambda(
    "person",
    Get(Var("person"))
  )
)

5 FQL注册及登录流程示例


(1) 查询账户是否存在

注册与登录都需要先判断用户是否存在,首先创建索引:

CreateIndex({
  name: "search_by_name",
  source: Collection("userdata"),
  terms: [
    {
      field: ["data", "name"]
    }
  ]
})

判断是否存在用户:

If(Equals(Select("data", Count(Paginate(
    Match(Index("search_by_name"), "testname")
  ))), [1]), "Existing", "Not Existing")

(2) 创建用户


注册时,通过以下方式创建用户:

  Create(
    Collection("userdata"),
    {
      data: {
        "name": "testname",
        "pwd": "123456",
        "email": "test@gmail.com"
      },
    }
  )

(3) 组装成供客户端访问注册函数


在FaunaDB控制台添加Function, 命名为“register_user”:

Query(
  Lambda(
    ["username", "password", "email"],
    If(
      Equals(
        Select(
          "data",
          Count(Paginate(Match(Index("search_by_name"), Var("username"))))
        ),
        [1]
      ),
      404,
      Create(Collection("userdata"), {
        data: {
          name: Var("username"),
          pwd: Var("password"),
          email: Var("email")
        }
      })
    )
  )
)

使用以下命令在FaunaDB的Shell命令行中测试:

Call("register_user", ["testname", "123456", "test@gmail.com"])

后续我们在管理界面创建一个Role,保证该Role可以访问以上函数。


(4) 组装成供客户端访问登录函数

直接判断存在账户及密码,命名为函数“login_user”:

Query(
  Lambda(
    ["username", "password"],
    Count(
      Filter(
        Select("data", Paginate(Match(Index("search_by_name"), Var("username")))),
        Lambda("record",  Equals(Select("pwd", Select("data", Get(Var("record")))), Var("password")))
      )
    )
  )
)

使用以下命令在FaunaDB的Shell命令行中测试:

Call("login_user", ["testname", "123456"])

(5) 创建客户端Role


为客户端创建Role,仅允许访问所添加的函数:

FaunaDBRole.png


(6) 生成客户端Key


为客户端Role创建密钥,供客户端访问以上函数:

FaunaDBKey.png


(7) 客户端访问


复制(6)中生成的密钥,访问登录与注册函数即可, 以C#为例:

static async Task DoQuery(FaunaClient client)
{
    Value result = await client.Query(Call(Function("login_user"), "testname", "1234656"));
}

public void Login()
{
    var client = new FaunaClient(endpoint: ENDPOINT, secret: SECRET);
    DoQuery(client).Wait();
}

备注

(1)遍历结果

Map(
  Select("data", Paginate(Match(Index("search_by_name"), "testname"))),
  Lambda("record", Select("pwd", Select("data", Get(Var("record")))))
  )

(2) 过滤结果

Filter(
  Select("data", Paginate(Match(Index("search_by_name"), "testname"))),
  Lambda("record",  Equals(Select("pwd", Select("data", Get(Var("record")))), "123456")
  )
)

Tags: UE4 VSCode Vistied:
Share: Twitter Facebook LinkedIn