"_id" : "639d8a50-7864-458f-9a7d-b72647a3d226",
"ParentGuid" : "00000000-0000-0000-0000-000000000000",
"Name" : "汉字",
"Describe" : "",
"Enable" : true,
"Level" : 2,
"Subject" : "语文",
"Exams" : [
{
"ExamGuid" : "6635e1c6-2a22-404e-b58c-97ed9fc49ffc",
"Grade" : "G2",
"Questions" : [
{
"_id" : "97eeeaaa-5902-4c11-bcdb-8b7a70485753"
},
{
"_id" : "628d5613-90b1-44fa-b02d-4074e86aa751"
}
]
},
{
"ExamGuid" : "b1e72692-6b63-4d98-a4bb-1b48765e7a96",
"Grade" : "G1",
"Questions" : [
{
"_id" : "628d5613-90b1-44fa-b02d-4074e86aa751"
}
]
}
]
 

场景1:给内嵌集合的元素添加一个新的元素

1.首先根据筛选条件确定元素

  var filter = Builders<CustomKnowPoint>.Filter.And(
Builders<CustomKnowPoint>.Filter.Eq(o => o.Id, "639d8a50-7864-458f-9a7d-b72647a3d226"),
Builders<CustomKnowPoint>.Filter.Eq("Exams.ExamGuid", "6635e1c6-2a22-404e-b58c-97ed9fc49ffc"));

CustomKnowPoint为MongoDB映射的对象  Builders<CustomKnowPoint>.Filter.And 方法的参数是一个param[]数组,意思是将所有的过滤条件用And且的关系合并

var update = Builders<CustomKnowPoint>.Update.Push("Exams.$.Questions", new QuestionGuid(Guid.NewGuid().ToString()));
this.Collection.FindOneAndUpdate(filter, update);

2.执行后Questions内嵌集合就会在元素的末尾添加一条新的记录

场景2:内嵌集合的元素进行删除

 

过滤条件同上面的新增一样 通过对象本身的Id和内嵌元素的ExamGuid固定内嵌文档,移除文档的具体Filter对象是移除对象本身Builders<QuestionGuid>.Filter而不是Builders<CustomKnowPoint>.Filter

var update = Builders<CustomKnowPoint>.Update.PullFilter("Exams.$.Questions", Builders<QuestionGuid>.Filter.Eq("_id", "628d5613-90b1-44fa-b02d-4074e86aa751"));
this.Collection.FindOneAndUpdate(filter, update);

场景3:聚合使用

MongoDB的聚合管道将MongoDB文档在一个管道处理完毕后将结果传递给下一个管道处理。管道操作是可以重复的。表达式:处理输入文档并输出。表达式是无状态的,只能用于计算当前聚合管道的文档,不能处理其它的文档。

"_id" : "639d8a50-7864-458f-9a7d-b72647a3d226",
"ParentGuid" : "00000000-0000-0000-0000-000000000000",
"Name" : "汉字",
"Describe" : "",
"Enable" : true,
"Level" : ,
"Subject" : "语文",
"Exams" : [
{
"ExamGuid" : "6635e1c6-2a22-404e-b58c-97ed9fc49ffc",
"Grade" : "G2",
"Questions" : [
{
"_id" : "97eeeaaa-5902-4c11-bcdb-8b7a70485753"
},
{
"_id" : "628d5613-90b1-44fa-b02d-4074e86aa751"
}
]
}
]

当我们只需要返回内嵌文档部分的时候 这种场景下我们就可以用到聚合来操作了 执行MongoDB语句

db.KnowPoint.aggregate(
[
{
/*此处$unwind:将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值。*/
$unwind : "$Exams"
},
{
    /*此处$match :过滤文档筛选条件。*/
$match :
{
"Exams.ExamGuid" : "6635e1c6-2a22-404e-b58c-97ed9fc49ffc"
}
},
{
    /*此处group 分组。*/
$group :
{
_id :
{
            /*此处按照各种属性拼凑分组 将各属性组成一个Id的属性*/
"_id" : "$_id", "ParentGuid" : "$ParentGuid", "Name" : "$Name", "Enable" : "$Enable", "Level" : "$Level", "Subject" : "$Subject"
},
"Exams" :
{
            /*此处push将之前分组的Exams再写进去*/
"$push" : "$Exams"
}
}
}
])

相应的C# 驱动程序

            List<string> keys = new List<string>() { "_id", "ParentGuid", "Name", "Enable", "Level", "Subject" };
var stages = new List<IPipelineStageDefinition>();
#region 过滤条件
stages.Add(new JsonPipelineStageDefinition<BsonDocument, BsonDocument>
(
"{" +
"$unwind:\"$Exams\"" +
"}"
));
stages.Add(new JsonPipelineStageDefinition<BsonDocument, BsonDocument>
(
"{" +
"$match:" +
"{" +
"\"Exams.ExamGuid\":" +
"{" +
"$in:" + JsonConvert.SerializeObject(new List<string>() { "6635e1c6-2a22-404e-b58c-97ed9fc49ffc"}) +
"}" +
"}" +
"}"
)); stages.Add(new JsonPipelineStageDefinition<BsonDocument, BsonDocument>
(
"{" +
"$group:" +
"{" +
"_id:{ " + string.Join(",", keys.Select(o => "\"" + o + "\":\"$" + o + "\"").ToList()) + " }," +
"Exams:{$push:\"$Exams\"}" +
"}" +
"}"
));
#endregion var pipeline = new PipelineStagePipelineDefinition<BsonDocument, BsonDocument>(stages); var result = this.Context
.DbSet<BsonDocument>(nameof(KnowPoint))
.Aggregate(pipeline)
.ToList()

MongoDB 系列(二) C# 内嵌元素操作 聚合使用的更多相关文章

  1. MongoDB查询或修改内嵌文档

    作为非关系型数据库中的佼佼者,MongoDB一大优势在于能够在一条文档中存储对象类型的数据,适当增加冗余来让数据库更好用.文档中一个对象类型的字段在MongoDB中被称为内嵌文档(Embedded) ...

  2. web - 块元素和内嵌元素的特征

    块: 1.独占一行 2.支持所有的样式 3.不设置宽度的时候,宽度撑满整行 常用的快标签有: div,section,header,nav,footer,article,aside,ul,ol,li, ...

  3. MongoDB系列二(介绍).

    一.特点 学习一个东西,至少首先得知道它能做什么?适合做什么?有什么优缺点吧? 传统关系型数据库,遵循三大范式.即原子性.唯一性.每列与主键直接关联性.但是后来人们慢慢发现,不要把这些数据分散到多个表 ...

  4. 关于selenium自动化对iframe内嵌元素的处理

    今天上班闲来无聊,于是来练练自动化,结果碰上了可恶的iframe,楼主,以前也遇到过,但是一直也没搞懂怎么处理的,都是抄别人的代码,今天决定独立解决试试.首先先来认识什么是iframe,它就长下图这样 ...

  5. Selenium4.0+Python3系列(四) - 常见元素操作(含鼠标键盘事件)

    一.写在前面 上篇文章介绍的是关于浏览器的常见操作,接下来,我们将继续分享关于元素的常见操作,建议收藏.转发! 二.元素的状态 在操作元素之前,我们需要了解元素的常见状态. 1.常见元素状态判断,傻傻 ...

  6. css中块级元素、内联元素(行内元素、内嵌元素)

    Block element 块级元素    顾名思义就是以块显示的元素,高度宽度都是可以设置的.比如我们常用 的<div>.<p>.<ul>默认状态下都是属于块级元 ...

  7. MongoDB系列二

    简介 MongoDB是一个基于分布式文件存储的数据库.由C++语言编写.旨在为WEB应用提供可扩展的高性能数据存储解决方案.  MongoDB是一个高性能,开源,无模式的文档型数据库,是当前NoSql ...

  8. glance系列二:glance部署及操作

    一 简单架构图示参考 更新中... 二 部署glance yum install memcached python-memcachedsystemctl enable memcached.servic ...

  9. MongoDB系列一(索引及C#如何操作MongoDB)

    索引总概况 db.test.ensureIndex({"username":1})//创建索引 db.test.ensureIndex({"username": ...

随机推荐

  1. phpmyadmin客户端多服务器配置

    修改libraries/config.default.php 545行,添加 $cfg['Servers']['2'] = $cfg['Servers'][$i];$cfg['Servers']['2 ...

  2. js如何计算浮点数

    js中浮点型是如何运算的呢? 例如:var a=0.69; 我想得到6.9 直接这样写 var c=a*10; alert(c);   得到结果是:6.8999999999999995 到网上一搜,有 ...

  3. CentOS 7 安装 vmware tools 提示The path "" is not a valid path to the 3.10.0-957.el7.x86_64 kernel headers.

    输入“mkdir /mnt/cdrom”在/mnt目录下新建一个名为cdrom的文件夹 mkdir /mnt/cdrom 输入“mount -t iso9660 /dev/cdrom /mnt/cdr ...

  4. Binary Indexed Tree 总结

    特点 1. 针对 数组连续子序列累加和 问题(需要进行频繁的 update.sum 操作): 2. 并非是树型结构,只是逻辑上层次分明: 3. 可以通过 填坑法 来理解: 4. 中心思想:每一个整数都 ...

  5. C# 异步编程学习(一)

    异步 编程 可在 等待 某个 任务 完成时, 避免 线程 的 占用, 但要 想 正确地 实现 编程, 仍然 十分 伤脑筋. . NET Framework 中, 有三种 不同 的 模型 来 简化 异步 ...

  6. Java 系列之spring学习--springmvc注解参数传递(六)

    一.绑定参数注解如下 @RequestParam     绑定单个请求数据,既可以是URL中的参数,也可以是表单提交的参数或上传的文件. 它有三个属性:  value    用于设置参数名. defa ...

  7. css+html应用实例1:滑动门技术的简单实现

    关于滑动门,现在的页面中好多地方都会用到滑动门,一般用作于导航背景,它的官方解释如下: 滑动门:根据文本自适应大小,根据背景的层叠性制作,并允许他们在彼此之上进行滑动,以创造出一些特殊的效果. 为什么 ...

  8. SQL where 条件顺序对性能的影响有哪些

    经常有人问到oracle中的Where子句的条件书写顺序是否对SQL性能有影响,我的直觉是没有影响,因为如果这个顺序有影响,Oracle应该早就能够做到自动优化,但一直没有关于这方面的确凿证据.在网上 ...

  9. swift使用查阅资料备份2

    Swift3.0朝圣之路-Then协议库-绝妙的初始化方式 https://www.jianshu.com/p/6cc1e21df6ac DisposeBag http://southpeak.git ...

  10. ZBrush中Blob点滴笔刷介绍

    对于ZBrush®来说,笔刷的使用时至关重要的,ZBrush中给我们提供了越来越多的笔刷的同时,我们也要根据经验来合理选择笔刷.本文内容小编将分享Blob点滴笔刷的简单介绍,该笔刷在使用时笔头犹如一股 ...