首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何使用BsonDocument C# .NET驱动程序在MongoDB中执行聚合的多个投影和查找?

如何使用BsonDocument C# .NET驱动程序在MongoDB中执行聚合的多个投影和查找?
EN

Stack Overflow用户
提问于 2019-09-05 07:35:25
回答 1查看 806关注 0票数 1

我无法使用C# .NET驱动程序的聚合功能来执行多个投影和查找。

这里我需要用mongodb C# .NET驱动程序来复制查询。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
db.organizations.aggregate([
  {
    "$project": {
      "_id": {
        "$toString": "$_id"
      },
      "Name": "$Name",
      "LastDateUploaded": "$LastDateUploaded",
      "LastDateEvaluated": "$LastDateEvaluated",
      "PriorityId": "$PriorityId"
    }
  },
  {
    "$lookup": {
      "from": "workflows",
      "localField": "_id",
      "foreignField": "Data.OrganizationId",
      "as": "RelatedWorkflows"
    }
  },
  {
    "$lookup": {
      "from": "priorities",
      "localField": "PriorityId",
      "foreignField": "_id",
      "as": "Priority"
    }
  },
  {
    "$unwind": "$Priority"
  },
  {
    "$project": {
      "Name": "$Name",
      "WorkflowCounter": {
        "$size": "$RelatedWorkflows"
      },
      "LastDateUploaded": "$LastDateUploaded",
      "LastDateEvaluated": "$LastDateEvaluated",
      "Priority": "$Priority.Value"
    }
  },
  {
    "$sort": {
      "Priority": -1,
      "WorkflowCounter": 1,
      "LastDateUploaded": -1,
      "LastDateEvaluated": -1
    }
  }
])

我试着这样做:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Organization
    {
        [BsonId]
        [BsonRepresentation(BsonType.ObjectId)]
        public string Id {get; set;}
        public string NPOId { get; set; }
        public string Name { get; set; }
        public string Address { get; set; }
        [BsonRepresentation(BsonType.ObjectId)]
        public string PriorityId { get; set; }
        [BsonIgnoreIfDefault]
        public Priority Priority { get; set; }
        public string City { get; set; }
        public string County { get; set; }
        [MaxLength(2)]
        public string State { get; set; }
        [BsonRepresentation(BsonType.ObjectId)]
        public string CountryId { get; set; }
        [BsonIgnoreIfDefault]
        public Country Country { get; set; }
        [MaxLength(5)]
        public string Zip { get; set; }
        public string TaxCode { get; set; }
        public string ParentTaxCode { get; set; }
        [BsonRepresentation(BsonType.ObjectId)]
        public string CharityTypeId { get; set; }
        [BsonRepresentation(BsonType.ObjectId)]
        public string PreferredExtractorId { get; set; }
        [BsonIgnoreIfDefault]
        public User PreferredExtractor{ get; set; }
        [BsonIgnoreIfDefault]
        public CharityType CharityType { get; set; }
        public string URL { get; set; }
        public decimal Revenue { get; set; }
        public decimal Expenses { get; set; }
        public decimal Assets { get; set; }
        public decimal Excess { get; set; }
        public string IRSType { get; set; }
        public string ICPAScore { get; set; }
        public string ICPBScore { get; set; }
        public string[] DefaultRules { get; set; }
        [BsonIgnore]
        public long NumberOfWorkflows { get; set; }
        public DateTime? LastDateUploaded { get; set; }
        public DateTime? LastDateEvaluated { get; set; }
    }

var organizations = db.GetCollection<Organization>("catalog.organizations");
            var aggregation = organizations.Aggregate().Match(_ => true);

            var projectionOne = new BsonDocument {
                { "$project", new BsonDocument { { "_id", new BsonDocument { { "$toString", "$_id" } } } } },
                { "Name", "$Name"},
                { "LastDateUploaded", "$LastDateUploaded" },
                { "LastDateEvaluated", "$LastDateEvaluated"},
                { "PriorityId", "$PriorityId"}
            };

            aggregation.Project(projectionOne);

            aggregation.AppendStage<Organizations>(new BsonDocument {
                { "$lookup", new BsonDocument { { "from", "wcf.workflows" }, { "localField", "_id" }, { "foreignField", "Data.OrganizationId" }, { "as", "RelatedWorkflows" } } }
            });

            aggregation.AppendStage<Organizations>(new BsonDocument {
                { "$lookup", new BsonDocument { { "from", "catalog.priorities" }, { "localField", "PriorityId" }, { "foreignField", "_id" }, { "as", "Priority" } } }
            });

            aggregation.AppendStage<Organizations>(new BsonDocument {
                { "$unwind", "$Priority" }
            });

            aggregation.AppendStage<Organizations>(new BsonDocument {
                { "$project", new BsonDocument { { "Name", "$Name" }, { "WorkflowCounter", new BsonDocument { { "$size", "$RelatedWorkflows" } } } } },
                { "LastDateUploaded", "$LastDateUploaded" },
                { "LastDateEvaluated", "$LastDateEvaluated"},
                { "PriorityValue", "$Priority.Value"}
            });

            aggregation.AppendStage<Organizations>(new BsonDocument {
                { "$sort", new BsonDocument { { "Priority", 1 }, { "WorkflowCounter", 1 }, { "LastDateUploaded", -1 }, { "LastDateEvaluated", -1} } }
            });

            var organizationsList = await aggregation.ToListAsync();

然而,这并不起作用,例如,我颠倒了排序选项,并且总是返回相同的值。我试图获得mongo查询的字符串表示,但我只得到了

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
aggregate([{ "$match" : { } }])

并且不附加聚合定义。

我尝试使用fluent符号来执行查找,但我需要使用ObjectId和string字段来执行查找,因此,出于这个原因,我首先在MongoDB端使用第一个投影将ObjectId解析为字符串,似乎在fluent符号上没有等价的方法来将ObjectId转换为字符串,以便执行查找(也称为join)。

下面是查询在mongo shell上正常工作的测试证明:https://mongoplayground.net/p/dKT8uQHjHnd

我希望从生成的列表中获得第一个文档,就像在mongo playground示例中一样,但我总是获得集合的第一个元素。

EN

回答 1

Stack Overflow用户

发布于 2019-09-06 03:52:55

我结束了下一步:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        var organizations = db.GetCollection<Organization>("catalog.organizations");
        var projectionOne = new BsonDocument {
                                                { "$project", new BsonDocument { 
                                                        { "_id", new BsonDocument { { "$toString", "$_id" } } },
                                                        { "Name", "$Name"},
                                                        { "LastDateUploaded", "$LastDateUploaded" },
                                                        { "LastDateEvaluated", "$LastDateEvaluated"},
                                                        { "PriorityId", "$PriorityId"}
                                                    } 
                                                }
        };

        var lookupOne = new BsonDocument {
            { "$lookup", new BsonDocument { { "from", "wfc.workflows" }, { "localField", "_id" }, { "foreignField", "Data.OrganizationId" }, { "as", "RelatedWorkflows" } } }
        };
        var lookupTwo = new BsonDocument {
            { "$lookup", new BsonDocument { { "from", "catalog.priorities" }, { "localField", "PriorityId" }, { "foreignField", "_id" }, { "as", "Priority" } } }
        };
        var unwindTwo = new BsonDocument {
            { "$unwind", "$Priority" }
        };

        var projectionTwo = new BsonDocument {
                                            { "$project", new BsonDocument { 
                                                    { "Name", "$Name" }, 
                                                    { "WorkflowCounter", new BsonDocument { { "$size", "$RelatedWorkflows" } } },
                                                    { "LastDateUploaded", "$LastDateUploaded" },
                                                    { "LastDateEvaluated", "$LastDateEvaluated"},
                                                    { "PriorityValue", "$Priority.Value"}
                                                } 
                                            }
        };

        var sort = new BsonDocument {
            { "$sort", new BsonDocument { { "PriorityValue", -1 }, { "WorkflowCounter", 1 }, { "LastDateUploaded", -1 }, { "LastDateEvaluated", -1} } }
        };

        var aggregation = organizations.Aggregate<OrganizationWithWorkflows>(new [] {projectionOne, lookupOne, lookupTwo, unwindTwo, projectionTwo, sort});

        var organizationsList = await aggregation.ToListAsync();

我创建了这个类来获得最后的投影结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 [BsonIgnoreExtraElements]
 public class OrganizationWithWorkflows
 {
      public string Id { get; set; }
      public string Name { get; set; }
      public long WorkflowCounter {get; set;}
      public DateTime? LastDateUploaded { get; set; }
      public DateTime? LastDateEvaluated { get; set; }
      public int PriorityValue { get; set; }
 }

我花了一段时间,但我最终在这里解决了我的挑战,部分原因是使用ObjectId和string字段执行查找,应用从ObjectId到string的强制转换,并在同一查询中应用多个投影和多次查找。

我希望这能帮助所有那些在理解如何使用BsonDocuments使用MongoDB聚合和C# .NET驱动的人,因为由于ObjectId到字符串的转换,这个查询不可能使用流畅的表示法创建,并将那个用于lookupOne,也许我在最后这部分是错误的,所以如果你知道如何做,相信我也会很高兴地学习它。

为了得到我的解决方案,我从Mikael Koskinen找到了this awesome post,并阅读了mongodb文档以使用expression $toString

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57800546

复制
相关文章
df 和 ls 命令执行夯主
其实他说第二点问题的时候我就已经猜到问题所在了,那不就是远程挂载的磁盘非正常的掉了,然后就会造成这个问题。但是他说 ISCSI 这个玩意的时候我不知道是啥,于是查了一下,有兴趣的同学可以看看这是:https://zhuanlan.zhihu.com/p/60986068,看的出来他是一个网络存储,那么就更加坚定我的想法了,开始指挥解决问题。
张琳兮
2020/05/25
2K0
df 和 ls 命令执行夯主
Linux进程控制【进程程序替换】
子进程 在被创建后,共享的是 父进程 的代码,如果想实现自己的逻辑就需要再额外编写代码,为了能让 子进程 执行其他任务,可以把当前 子进程 的程序替换为目标程序,此时需要用到 Linux 进程程序替换相关知识
北 海
2023/07/01
2590
Linux进程控制【进程程序替换】
Linux系统下进程编程之exec族函数解析(四)
fork函数是用于创建一个子进程,该子进程几乎是父进程的副本,而有时我们希望子进程去执行另外的程序,exec函数族就提供了一个在进程中启动另一个程序执行的方法。它可以根据指定的文件名或目录名找到可执行文件,并用它来取代原调用进程的数据段、代码段和堆栈段,在执行完之后,原调用进程的内容除了进程号外,其他全部被新程序的内容替换了。另外,这里的可执行文件既可以是二进制文件,也可以是Linux下任何可执行脚本文件。
用户6280468
2022/03/18
1.4K0
Linux系统下进程编程之exec族函数解析(四)
awk中执行mv命令
我现在有一个thinkphp文件夹,我需要将文件夹下面所有的.class.php修改为.php
魔王卷子
2019/05/28
2K0
【Linux】进程的程序替换
红框中的代码实际上是父进程的代码,在没有执行fork之前代码就有了,在没有创建子进程之前,父进程的代码加载到内存了,子进程被创建出来是没有独立的代码,这个代码是父进程的代码,父进程通过if判断分流让子进程去跑了
lovevivi
2023/04/28
2K0
【Linux】进程的程序替换
exec族
这个一直没搞太明白,相识度高是一回事,不会用又是另一回事儿。 所以今天又温故了一遍:
看、未来
2020/08/26
1.1K0
srvctl start_执行命令ls>c
==禁止服务在某个实例上运行 srvctl disable service -d orcl -s servicename -i orcl1
全栈程序员站长
2022/10/01
6160
ctf中命令执行的绕过方法
在这之前,我们先来总结一下常用的命令注入绕过方法,还是挺有意思的,会对 Linux 指令更加熟练(下面有些 Linux 命令只在 bash 下有效,在 zsh 里面可能会不行)
棒棒鸡不棒
2022/09/01
2.4K0
温故Linux后端编程(二):进程
fork调用一次返回两次 父进程中返回子进程id (就是大于0的意思) 子进程返回0 读时共享写时复制,可保高效
看、未来
2021/09/18
7120
Mybatis中执行String类型的自己拼写的sql,不执行配置文件中的sql
Mybatis中执行String类型的自己拼写的sql,不执行配置文件中的sql
业余草
2019/01/21
1.4K0
Mybatis中执行String类型的自己拼写的sql,不执行配置文件中的sql
scrapy - Request 中的回调函数不执行or只执行一次
在 scrapy 中, scrapy.Request(url, headers=self.header, callback=self.parse) 调试的时候,发现回调函数 parse 没有被调
周小董
2019/03/25
2.6K0
python中执行shell命令的几个方
最近有个需求就是页面上执行shell命令,第一想到的就是os.system, 代码如下:
py3study
2020/01/06
3K0
关于docker中执行docker命令的实践
最近在制作给kubernetes jenkins plugin调用的jenkins slave(默认情况下,kubernetes jenkins插件使用的是jenkinsci/jnlp-slave)容器镜像,以供自动创建的pod使用。对这个镜像的需求是:希望在pod运行的容器内,执行docker命令,完成docker build, push等一些操作,即docker in docker。
全栈程序员站长
2022/08/27
9580
关于docker中执行docker命令的实践
npm是如何执行scripts中命令的?
过去一直有一个疑问,为什么我在命令行运行 npm start,可以正常启动 webpack,而直接使用 craco start 不行?
lonelydawn
2022/09/07
8380
npm是如何执行scripts中命令的?
linux系统编程之进程(三):exec系列函数和system函数
一、exec替换进程映象 在进程的创建上Unix采用了一个独特的方法,它将进程创建与加载一个新进程映象分离。这样的好处是有更多的余地对两种操作进行管理。当我们创建 了一个进程之后,通常将子进程替换成新
s1mba
2018/01/03
2.2K0
linux系统编程之进程(三):exec系列函数和system函数
Redis中除了EVAL和EVALSHA之外,其他可以执行Lua脚本的命令
这些命令以及EVAL和EVALSHA命令一起,可以方便地进行Lua脚本的加载、执行和管理。通过执行Lua脚本,可以实现更复杂和灵活的Redis操作。
一凡sir
2023/10/04
2470
Redis中除了EVAL和EVALSHA之外,其他可以执行Lua脚本的命令
Linux进程控制
在进程概念这篇文章中,我们浅浅地了解了一下fork函数,它的功能是让父进程去创建一个子进程,并且有两个返回值,对应着父进程的返回值和子进程的返回值。那么,为什么会这样?接下来我们好好地讨论一下fork函数。
二肥是只大懒蓝猫
2023/03/30
2.4K0
Linux进程控制
点击加载更多

相似问题

C execvp不会执行"ls -l“命令,但会执行"ls”

136

如何使用execvp实现ls -l命令?

19

未运行ls -l *.c的execvp命令

43

linuux - execvp :在执行ls命令时- get错误“ls: cannot access /etc :没有这样的文件或目录”

11

execvp不执行用户输入给出的命令

135
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文