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


    前序

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

    1. 准备实体模型

     

    复制代码
        /// 
        /// 用户实体(Collection)
        /// 
        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; }
        }
        /// 
        /// 角色实体(Collection)
        /// 
        public class Role
        {
            public Guid RoleId { get; set; }
    
            public string RoleName { get; set; }
    
            public DateTime CreateTime { get; set; }
        }
        /// 
        /// 构建用户Dto(不在Mongo创建Collection)
        /// 
        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 .前置连接Mongo代码

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

    3. 构建BsonDocumentProjectionDefinition

    复制代码
    BsonDocumentProjectionDefinition projectionDefinition = new BsonDocumentProjectionDefinition(
                            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 list = database.GetCollection(typeof(User).Name)
                    .Aggregate()
                    //过滤条件
                    .Match(Builders.Filter.Eq("IsDelete", false))
                    .Match(Builders.Filter.Eq("RoleId", roleId))
                    //连接Role
                    .Lookup(typeof(Role).Name, "RoleId", "RoleId", typeof(UserDto).Name)
                    //查询需要显示的列
                    .Project(projectionDefinition)
                    .As().ToList();
    复制代码

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

     

  • 相关阅读:
    05- 基于UDS协议的故障代码状态字节及检测机制
    C. Fibonacci Words-April Fools Day Contest 2021
    “三门问题”解决方案:换不换?更换策略与贝叶斯策略?附 Java 验证代码
    Linux中Java图片、二维码设置的中文变成乱码问题解决
    浅谈小程序开源业务架构建设之路
    pnpm : 无法加载文件 C:\Users\lenovo\AppData\Roaming\npm\pnpm.ps1
    设备管理的未来是什么?5 对未来的预测
    eggjs的mvc模式demo(纯静态)
    云计算存储虚拟化技术
    RPC远程调用框架Dubbo
  • 原文地址:https://www.cnblogs.com/honglinjia/p/16813761.html