Skip to content

数据库操作

我们目前采用MongoDB作为主要数据库,但未来我们计划扩展,支持更多类型的数据库,以满足不同业务需求和更复杂的数据处理场景。
框架中的实体(Entity)对象可以直接映射到数据库,实现数据的持久化存储和读取操作。通过这种方式,开发者无需编写额外的代码来处理数据库操作,只需专注于业务逻辑,极大简化了数据访问层的开发工作。

如何操作DB

用户只需获取当前的Scene,然后通过该Scene所关联的World对象来访问相应的数据库。

Count

// 获得操作DB的接口
var worldDateBase = scene.World.DateBase;

Count

在指定集合中检索符合给定筛选条件的特定类型实体数量。该方法接受一个泛型参数,表示要查询的实体类型,并根据此类型对集合中的实体进行筛选与计数。

该方法有两个重载:

  • Count(string collection = null)
  • Count(Expression filter, string collection = null)

参数说明:

  • filter:检索的表达式树。
  • collection:要检索的表名,不输入会默认拿泛型的类型当做表名。

Count

var worldDateBase = scene.World.DateBase;
// 统计数据库User表里的总数
var userCount = await worldDateBase.Count<User>();
Log.Debug($"查询到当前的User总数为: {userCount}");
// 统计数据库User表里Age大于等于20的总数
var userAgeCount = await worldDateBase.Count<User>(d => d.Age >= 20);
Log.Debug($"查询到当前的User.Age大于等于20的总数为: {userAgeCount}");

Exist

该方法用于检查指定集合中是否存在特定类型的实体。它接受一个泛型参数,用于指定要查询的实体类型,并返回一个布尔值,指示该类型的实体是否存在于集合中。

该方法有两个重载:

  • Exist(string collection = null)
  • Exist(Expression filter, string collection = null)

参数说明:

  • filter:检索的表达式树。
  • collection:要检索的表名,不输入会默认拿泛型的类型当做表名。

Count

var worldDateBase = scene.World.DateBase;
// 查找数据库User表里是否有数据
var haveUser = await worldDateBase.Exist<User>();
// 数据库User表里Age大于等于20的User是否存在
var haveUser = await worldDateBase.Exist<User>(d => d.Age >= 20);

Query

Query

从指定的集合中检索特定类型的实体。该方法接受一个泛型参数,用于指定要查询的实体类型,并返回与该类型匹配的一个或多个实体对象。

该方法有四个重载:

  • Query(long id, string collection = null)
  • Query(Expression filter, string collection = null)
  • Query(long id, List collectionNames, List result)
  • Query(Expression filter, string[] cols, string collection = null)

参数说明:

  • id:需要查找的实体Id。
  • cols:需要返回实体的字段或属性。
  • filter:查找的表达式树。
  • collection:查找的表名,不输入会默认拿泛型的类型当做表名。
  • collectionNames:要查询多个表的表名的数组。
  • result:配合collectionNames参数使用,会把查询到的数据存放到result的数组中。

Query

var worldDateBase = scene.World.DateBase;
// 查找数据库User表里Id为1的数据
var user = await worldDateBase.Query<User>(1);
// 查找数据库User表里Age大于等于20的User,并返回一个数组。
List<User> user = await worldDateBase.Query<User>(d => d.Age >= 20);
// 查找数据库User表里Age大于等于20的User,并返回一个数组。只返回Age和Name两个字段或属性的数据。
List<User> user = await worldDateBase.Query<User>(d => d.Age >= 20,"Age,Name");
// 查找User和Bag两个表里Id等于1的数据,并添加到result数组中。
var result = new List<Entity>();
var collectionNames = new List<string>
{
    "User",
    "Bag"
};
await worldDateBase.Query(1L, collectionNames, result);

QueryOrderBy

从指定的集合中检索特定类型的实体。该方法接受一个泛型参数,用于指定要查询的实体类型,并返回与该类型匹配的一个或多个实体对象。与 Query 方法不同的是,该方法额外支持排序功能,使用户能够根据指定的字段对查询结果进行排序。

该方法有一个重载:

  • QueryOrderBy(Expression filter, Expression orderByExpression, bool isAsc = true, string collection = null)

参数说明:

  • filter:查找的表达式树。
  • orderByExpression:需要进行排序的表达式树。
  • isAsc:升序还是降序默认是升序。
  • collection:查找的表名,不输入会默认拿泛型的类型当做表名。

QueryOrderBy

var worldDateBase = scene.World.DateBase;
// 查找数据库User表里Age大于等于20的User的数据,并且按照Name字段进行升序排序。
List<User> user = await worldDateBase.QueryOrderBy<User>(d => d.Age >= 20, d => d.Name);

QueryByPage

分页查询指定集合中满足给定筛选条件的类型的实体列表,该方法接受一个泛型参数,用于指定要查询的实体类型,并返回与该类型匹配的一个或多个实体对象。

该方法有二个重载:

  • QueryByPage(Expression filter, int pageIndex, int pageSize, string collection = null)
  • QueryByPage(Expression filter, int pageIndex, int pageSize, string[] cols, string collection = null)

参数说明:

  • filter:查找的表达式树。
  • pageIndex:当前页。
  • pageSize:每页大小。
  • cols:需要返回实体的字段或属性。
  • collection:查找的表名,不输入会默认拿泛型的类型当做表名。

QueryByPage

var worldDateBase = scene.World.DateBase;
// 查找数据库User表里Age大于等于20的User的数据,返回第一页的10条数据。
List<User> user = await worldDateBase.QueryByPage<User>(d => d.Age >= 20,1,10);
// 查找数据库User表里Age大于等于20的User,返回第一页的10条数据,只返回Age和Name两个字段或属性的数据。
List<User> user = await worldDateBase.QueryByPage<User>(d => d.Age >= 20,1,10,"Age,Name");

QueryByPageOrderBy

该方法用于分页查询指定集合中符合给定筛选条件的实体列表。它接受一个泛型参数,以指定要查询的实体类型,并返回与该类型匹配的一个或多个实体对象。与 QueryByPage 方法不同的是,该方法额外支持排序功能,使用户能够根据指定的字段对查询结果进行排序。

该方法有一个重载:

  • QueryByPageOrderBy(Expression filter, int pageIndex, int pageSize, Expression orderByExpression, bool isAsc = true, string collection = null)

参数说明:

  • filter:查找的表达式树。
  • pageIndex:当前页。
  • pageSize:每页大小。
  • orderByExpression:需要进行排序的表达式树。
  • isAsc:升序还是降序默认是升序。
  • collection:查找的表名,不输入会默认拿泛型的类型当做表名。

QueryByPageOrderBy

var worldDateBase = scene.World.DateBase;
// 查找数据库User表里Age大于等于20的User的数据,返回第一页的10条数据,并且按照Name字段进行升序排序。
List<User> user = await worldDateBase.QueryByPageOrderBy<User>(d => d.Age >= 20,1,10,d => d.Name);

First

此方法通过接受一个泛型参数来指定要查询的实体类型,并根据给定的筛选条件检索该类型的第一个符合条件的实体对象。它将返回一个与指定类型相匹配的实体,确保检索的结果符合所要求的条件。

该方法有二个重载:

  • First(Expression filter, string collection = null)
  • First(string json, string[] cols, string collection = null)

参数说明:

  • filter:查找的表达式树。
  • cols:需要返回实体的字段或属性。
  • json:通过Json格式进行查询(几乎用不到)。
  • collection:查找的表名,不输入会默认拿泛型的类型当做表名。

First

var worldDateBase = scene.World.DateBase;
// 查找数据库User表里Age大于等于20的User的第一个数据。
User user = await worldDateBase.First<User>(d => d.Age >= 20);

Insert

向指定集合中插入一个类型实体,如果集合不存在将自动创建。该方法接受一个泛型参数,用于指定要插入的实体类型。

该方法有一个重载:

  • Insert(T entity, string collection = null)

参数说明:

  • entity:要插入的实体。
  • collection:查找的表名,不输入会默认拿泛型的类型当做表名。

Insert

var worldDateBase = scene.World.DateBase;
// 插入User到User表中。
await worldDateBase.Insert(User);

InsertBatch

批量插入一组实体到指定集合中。该方法接受一个泛型参数,用于指定要插入的实体类型。

该方法有两个重载:

  • InsertBatch<(IEnumerable list, string collection = null)
  • InsertBatch(object transactionSession, IEnumerable list, string collection = null)

参数说明:

  • list:要插入的实体数组。
  • transactionSession:事务会话对象,具体可以查询MongoDB官网如何创建一个事务。
  • collection:查找的表名,不输入会默认拿泛型的类型当做表名。

InsertBatch

var worldDateBase = scene.World.DateBase;
var list = new List<User>
{
    new User(),
    new User()
};
// 把list里的所有User插入到User表中。
await worldDateBase.InsertBatch<User>(list);

Save

保存修改类型实体到指定集合中,如果集合不存在将自动创建。该方法接受一个泛型参数,用于指定要保存的实体类型。

该方法有三个重载:

  • Save(T entity, string collection = null)
  • Save(long id, List entities);
  • Save(object transactionSession, T entity, string collection = null)

参数说明:

  • entity:要保存的实体。
  • id:指定要保存的实体Id。
  • transactionSession:事务会话对象,具体可以查询MongoDB官网如何创建一个事务。
  • collection:查找的表名,不输入会默认拿泛型的类型当做表名。

InsertBatch

var worldDateBase = scene.World.DateBase;
// 把User保存到数据库中。
await worldDateBase.Save(User);

Remove

数据库中删除指定类型的实体。该方法接受一个泛型参数,用于指定要删除的实体类型。

该方法有四个重载:

  • Remove(long id, string collection = null)
  • Remove(object transactionSession, long id, string collection = null)
  • Remove(long id, Expression filter, string collection = null)
  • Remove(long id,object transactionSession, Expression filter, string collection = null)

参数说明:

  • filter:删除条件的表达式数。
  • id:指定要删除的实体Id。
  • coroutineLockQueueKey:异步锁的Id,用于避免异步出现的一些奇怪问题。
  • transactionSession:事务会话对象,具体可以查询MongoDB官网如何创建一个事务。
  • collection:查找的表名,不输入会默认拿泛型的类型当做表名。

Remove

var worldDateBase = scene.World.DateBase;
// 在User表中删除Id为1的User。
await worldDateBase.Save(1);
// 根据表达式数删除数据
await worldDateBase.Remove<User>(2, d => d.Age >= 20);

Sum

对满足条件的文档中的某个数值字段进行求和操作。

该方法有一个重载:

  • Sum(Expression filter, Expression sumExpression, string collection = null)

参数说明:

  • filter:参与统计条件的表达式数。
  • sumExpression:参与统计的某个字段的表达式树。
  • collection:查找的表名,不输入会默认拿泛型的类型当做表名。

Sum

var worldDateBase = scene.World.DateBase;
// 统计Age大于20的Age总和
var count = await worldDateBase.Sum(d => d.Age > 20, d > d.Age);

CreateIndex

在指定的集合中创建索引,以提高类型实体的查询性能。

该方法有两个重载:

  • CreateIndex(params object[] keys)
  • CreateIndex(string collection, params object[] keys)

具体使用方法参见MongoDB官网文档,这里只是提供了这个接口。

CreateDB

创建指定类型的数据库表,用于存储实体。

该方法有两个重载:

  • CreateDB() 该方法接受一个泛型参数,用于指定要创建表的实体类型。
  • CreateDB(Type type)

参数说明:

  • Type:要创建表的类型,创建成功后会以Type的名字做为表名。

Sum

var worldDateBase = scene.World.DateBase;
// 创建一个User的表
// 方式1
await worldDateBase.CreateDB<User>();
// 方式2
await worldDateBase.CreateDB(typeof(User));