首页 > 数据库 >.net core -利用 BsonDocumentProjectionDefinition 和Lookup 进行 join 关联 MongoDB 查询

.net core -利用 BsonDocumentProjectionDefinition 和Lookup 进行 join 关联 MongoDB 查询

时间:2022-10-21 17:25:26浏览次数:51  
标签:BsonDocumentProjectionDefinition set join get RoleId Add core Guid public

前序

     前段时间由于项目需要用到MongoDB,但是MongoDB不建议Collection join  查询,网上很多例子查询都是基于linq 进行关联查询。但是在stackoverflow找到一个例子,程序员的朋友们请善于利用goole搜索。主要介绍一个查询角色的所有用户的例子。MongoDB创建Collection 和准备数据,请自行处理。

1. 准备实体模型

 

    /// <summary>
    /// 用户实体(Collection)
    /// </summary>
    public class User
    {
        public Guid UserId { get; set; }

        public string UserName { get; set; }

        public string Password { get; set; }

        public bool IsDelete { get; set; }

        public DateTime CreateTime { get; set; }

        public Guid RoleId { get; set; }
    }
    /// <summary>
    /// 角色实体(Collection)
    /// </summary>
    public class Role
    {
        public Guid RoleId { get; set; }

        public string RoleName { get; set; }

        public DateTime CreateTime { get; set; }
    }
    /// <summary>
    /// 构建用户Dto(不在Mongo创建Collection)
    /// </summary>
    public class UserDto
    {
        public Guid UserId { get; set; }

        public string UserName { get; set; }

        public DateTime CreateTime { get; set; }

        public Guid RoleId { get; set; }

        public string RoleName { get; set; }
    }

 

2 .连接配置和前置代码

           var client = new MongoClient("xxx");
           var database = client.GetDatabase("xxx");

3. 构建BsonDocumentProjectionDefinition

BsonDocumentProjectionDefinition<BsonDocument> projectionDefinition = new BsonDocumentProjectionDefinition<BsonDocument>(
                        new BsonDocument("UserId", "$UserId")
                       .Add("UserName", "$UserName")
                       .Add("CreateTime", "$CreateTime")
                       .Add("RoleId", "$RoleId")
                       .Add("RoleName", new BsonDocument("$arrayElemAt", new BsonArray().Add("$Role.RoleName").Add(0)))
                    );

4.利用 Lookup 进行关联

            Guid roleId = Guid.Empty;
            List<UserDto> list = database.GetCollection<BsonDocument>(typeof(User).Name)
                .Aggregate()
                //过滤条件
                .Match(Builders<BsonDocument>.Filter.Eq("IsDelete", false))
                .Match(Builders<BsonDocument>.Filter.Eq("RoleId", roleId))
                //连接workflow 
                .Lookup(typeof(Role).Name, "RoleId", "RoleId", typeof(UserDto).Name)
                //查询需要显示的列
                .Project(projectionDefinition)
                .As<UserDto>().ToList();

第一次写博客,各位大佬请指教。

 

标签:BsonDocumentProjectionDefinition,set,join,get,RoleId,Add,core,Guid,public
From: https://www.cnblogs.com/honglinjia/p/16813761.html

相关文章

  • Asp.Net Core中有哪些异常处理
    1.继承Controller,重写OnActionExecuted默认都会继承一个Controller类,重写OnActionExecuted,添加上异常处理即可。一般情况下我们会新建一个BaseController,让所有Controll......
  • .net core 配置Swagger 摆脱PostMan,你值得拥有这样的api调试方式
    废话不多说直接来看第一步:安装nuget包:Swashbuckle.AspNetCore.Swagger            Swashbuckle.AspNetCore.SwaggerGen         ......
  • .Net Core EF的使用步骤
    EFCore--CodeFirst(代码优先)第一步安装NuGet包Microsoft.EntityFrameworkCoreMicrosoft.EntityFrameworkCore.SqlServerMicrosoft.EntityFrameworkCore.Tools第二步添......
  • 【WPF】EFCore 6.0生成SQLite实体对象
    EFCore-DBFirst方式生成SQLite实体对象环境vs2022+.net6.0+控制台+sqlite3,控制台可以生存实体;但是在Wpf中无法生存实体(不知道具体原因)。DBFirst采用FluentAPI来......
  • Fork-join框架
    Fork-join框架forkjoin特点:工作密取,平衡可用线程的工作负载。分支并行每个工作线程都有一个双端队列(一个工作线程将子任务压入其双端队列队头,一个工作线程空闲时,它会从......
  • .NET Core C#系列之XiaoFeng.Redis组件库础操作篇教程
    XiaoFeng.Redis组件库拥有丰富的API和巅峰之作的性能,下面我就先以基础的操作做如下讲解,循序渐进,慢慢提升。欢迎关注xiaofeng组件库,开源不易,多多支持。开源地址:https://git......
  • .Net Core WebApi 控制器自动创建文件夹上传图片
    ///<summary>///异步图片或文件上传///</summary>///<paramname="formFile"></param>///<returns></returns>[Http......
  • .net core中使用nlog替代默认日志
    1、添加引用nlog.config和Nlog.Web.AspNetCore 2、配置NLog配置文件<?xmlversion="1.0"encoding="utf-8"?><nlogxmlns="http://www.nlog-project.org/schemas/......
  • .NET Core Onvif协议C#教程系列之XiaoFeng.Onvif组件库
        物联网IOT大背景下音视频领域的Onvif协议在2008年成为全球性的开放接口标准。   于是一批开发者涌入该技术领域使用各种编程语言对其改造升级封装。 ......
  • Net6 定时调度Quartz.AspNetCore(3.5.0)的使用
    十年河东,十年河西,莫欺少年穷学无止境,精益求精1、概述Quartz.Net是根据Java的Quartz用C#改写而来,Quartz.NET是一个开源的作业调度框架,非常适合在平时的工作中,定时轮询数......