MongoDB 系列(二) C# 内嵌元素操作 聚合使用
2017-08-23 17:24
609 查看
"_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.首先根据筛选条件确定元素1varfilter=Builders<CustomKnowPoint>.Filter.And(
2Builders<CustomKnowPoint>.Filter.Eq(o=>o.Id,"639d8a50-7864-458f-9a7d-b72647a3d226"),
3Builders<CustomKnowPoint>.Filter.Eq("Exams.ExamGuid","6635e1c6-2a22-404e-b58c-97ed9fc49ffc"));
CustomKnowPoint为MongoDB映射的对象Builders<CustomKnowPoint>.Filter.And方法的参数是一个param[]数组,意思是将所有的过滤条件用And且的关系合并
varupdate=Builders<CustomKnowPoint>.Update.Push("Exams.$.Questions",newQuestionGuid(Guid.NewGuid().ToString()));
this.Collection.FindOneAndUpdate(filter,update);
2.执行后Questions内嵌集合就会在元素的末尾添加一条新的记录
场景2:内嵌集合的元素进行删除
过滤条件同上面的新增一样通过对象本身的Id和内嵌元素的ExamGuid固定内嵌文档,移除文档的具体Filter对象是移除对象本身Builders<QuestionGuid>.Filter而不是Builders<CustomKnowPoint>.Filtervarupdate=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":2,
"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=newList<string>(){"_id","ParentGuid","Name","Enable","Level","Subject"};
varstages=newList<IPipelineStageDefinition>();
#region过滤条件
stages.Add(newJsonPipelineStageDefinition<BsonDocument,BsonDocument>
(
"{"+
"$unwind:\"$Exams\""+
"}"
));
stages.Add(newJsonPipelineStageDefinition<BsonDocument,BsonDocument>
(
"{"+
"$match:"+
"{"+
"\"Exams.ExamGuid\":"+
"{"+
"$in:"+JsonConvert.SerializeObject(newList<string>(){"6635e1c6-2a22-404e-b58c-97ed9fc49ffc"})+
"}"+
"}"+
"}"
));
stages.Add(newJsonPipelineStageDefinition<BsonDocument,BsonDocument>
(
"{"+
"$group:"+
"{"+
"_id:{"+string.Join(",",keys.Select(o=>"\""+o+"\":\"$"+o+"\"").ToList())+"},"+
"Exams:{$push:\"$Exams\"}"+
"}"+
"}"
));
#endregion
varpipeline=newPipelineStagePipelineDefinition<BsonDocument,BsonDocument>(stages);
varresult=this.Context
.DbSet<BsonDocument>(nameof(KnowPoint))
.Aggregate(pipeline)
.ToList()
相关文章推荐
- [转载]在C#中使用官方驱动操作MongoDB
- C#中使用1.7版本驱动操作MongoDB简单例子
- MongoCola使用教程 1 - MongoDB的基本操作和聚合功能
- 在C#中使用官方驱动操作MongoDB
- 在C#中使用官方驱动操作MongoDB ---转载
- [C# 开发技巧系列] 使用C#操作幻灯片 推荐
- 在C#中使用官方驱动操作MongoDB
- unity3D使用C#遍历场景内所有元素进行操作
- 在C#中使用官方驱动操作MongoDB
- php7中使用mongoDB的聚合操作对数据进行分组求和统计操作
- MongoCola使用教程 1 - MongoDB的基本操作和聚合功能
- MongoCola使用教程 1 - MongoDB的基本操作和聚合功能
- unity3D使用C#遍历场景内所有元素进行操作
- 使用C#对MongoDB中的数据进行查询,改动等操作
- [C# 开发技巧系列]使用C#操作Word和Excel程序
- [C# 开发技巧系列]使用C#操作Word和Excel程序
- 在C#中使用官方驱动操作MongoDB
- 在C#中使用官方驱动操作MongoDB
- 使用C#对MongoDB中的数据进行查询,修改等操作
- 在c#中使用mongo-csharp-driver操作mongodb