分页查询集合(表)
- 动态条件查询
- 查询文档指定字段
- 排序
- 分页
定义查询操作
FilterDefinition<UserInfo> filter = _buildFilter.Empty;
查询条件由查询条件构造器构建,这个地方网上很多示例写的有bug,当查询所有集合(表)数据的时候,filter = null 在转换的时候会抛出异常
//创建查询条件构造器
FilterDefinitionBuilder<UserInfo> _buildFilter = Builders<UserInfo>.Filter;
//定义查询条件
FilterDefinition<UserInfo> filter = null;
if(!string.IsNullOrEmpty(request.Name)) filter = _buildFilter.Eq(m => m.Name, request.Name);
还有很多种类型的构造器,对应不同的操作
//排序操作
SortDefinition<UserInfo> sort
//排序构造器
Builders<UserInfo>.Sort
修改操作
UpdateDefinition<UserInfo> update
//修改构造器
Builders<UserInfo>.Update
完整的查询示例,比较麻烦的地方,是针对数组的条件查询,如果嵌套的层数比较多,查询也是同理的套娃查询
public class GetUserListRequest
{
/// <summary>
/// 名称
/// </summary>
public string Name { get; set; }
/// <summary>
/// 年龄
/// </summary>
public int? Age { get; set; }
/// <summary>
/// 创建时间
/// </summary>
public DateTime CreateTime { get; set; }
/// <summary>
/// 合作伙伴
/// </summary>
public Partner PartnerList { get; set; }
/// <summary>
/// 信息
/// </summary>
public Info Info { get; set; }
}
public async Task<List<UserInfo>> GetUserPageList(GetUserListRequest request)
{
if (request == null) return new List<UserInfo>();
FilterDefinition<UserInfo> filter = _buildFilter.Empty;
SortDefinition<UserInfo> sort = Builders<UserInfo>.Sort.Ascending(m => m.Age);
if (!string.IsNullOrEmpty(request.Name))
{
filter = _buildFilter.Eq(m => m.Name, request.Name);
}
if (request.Age.HasValue)
{
filter = _buildFilter.Eq(m => m.Age, request.Age);
}
if (request.PartnerList != null)
{
if (request.PartnerList.Status.HasValue)
{
filter = _buildFilter.ElemMatch("PartnerList", Builders<Partner>.Filter.Eq(m => m.Status, request.PartnerList.Status));
}
}
if (request.Info != null)
{
if (!string.IsNullOrEmpty(request.Info.Code))
{
filter = _buildFilter.Eq(m => m.Info.Code, request.Info.Code);
}
}
var list = await _userInfoRepertoty.FindListByPageAsync(filter,1,3, new string[] { "Name","Age", "CreateTime" }, sort);
return list;
}
动态条件查询(查询全部)
var list = await _userInfoRepertoty.FindListByPageAsync(filter, 1, 30);
条件查询,排序,分页,查询指定字段
var list = await _userInfoRepertoty.FindListByPageAsync(filter,1,3, new string[] { "Name","Age", "CreateTime" }, sort);
除了使用对象模型进行操作,也可以直接使用mongodb原生的BsonDocument进行操作
var buildFilter = Builders<BsonDocument>.Filter;
FilterDefinition<BsonDocument> filter = _buildFilter.Empty;;
BsonDocument bson = new BsonDocument
{
{ "Age",20},
{"Info.Status",3 }
};
foreach (var bs in bson)
{
filter = _buildFilter.Eq(bs.Name, bs.Value);
}
var sort = Builders<BsonDocument>.Sort;
var list = await collection.Find(filter).Sort(sort.Descending("age")).ToListAsync();
修改集合(表)的数据
- 修改满足条件的文档
- 修改文档的部分字段
public async Task UpdateUserInfo()
{
//修改条件
FilterDefinition<UserInfo> filter = _buildFilter.Empty;
filter = _buildFilter.Eq(m => m.Name, "tibos");
filter = _buildFilter.ElemMatch(list => list.PartnerList, child => child.Status == 1);
//修改字段
var update = Builders<UserInfo>.Update.Set("Age",100).Set("PartnerList.$.Name", "ppp").Set("PartnerList.$.Status", "");
await _userInfoRepertoty.UpdateManayAsync(update, filter);
}