二、包含“子集合”的集合操作
同样举个例子:有一个学校人事管理系统要统计班级和学生的信息,现在定义了一个“班级集合”,这个集合里面的学生字段是一个“学生集合”,包含了本班全部学生。
1) linq方式实现
基础配置我就不多说了,数据类定义如下:
- /// <summary>
- /// 班级信息
- /// </summary>
- public class ClassInfo
- {
- public string ClassName { get; set; }
- public List<Student> Students { get; set; }
- }
- /// <summary>
- /// 学生信息
- /// </summary>
- public class Student
- {
- public string Name { get; set; }
- public int Age { get; set; }
- }
查询叫“张三”的学生在哪个班级,以及他的详细信息:
(这里其实是ToList后在内存中查的,linq方式直接查询好像驱动不支持。)
- public List<ClassInfo> Select()
- {
- return mongoCollection.Linq().ToList().Where(x => x.Students.Exists(s => s.Name == "张三")).ToList();
- }
1) 普通实现
查询叫“张三”的学生在哪个班级,以及他的详细信息:
- public List<Document> Select()
- {
- var mongocollection = mongoDatabase.GetCollection("ClassInfo");
- return mongocollection.Find(new Document { { "Students.Name", "张三" } }).Documents.ToList();
- }
打印数据的BJSON:
- { "_id": "4d814bae5c5f000000005f63", "ClassName": "1001", "Students": [ { "Name": "张三", "Age": 10 }, { "Name": "李四", "Age": 0 } ] }
- { "_id": "4d814bae5c5f000000005f64", "ClassName": "1002", "Students": [ ] }
- { "_id": "4d814bae5c5f000000005f65", "ClassName": "1003", "Students": [ { "Name": "王五", "Age": 11 }, { "Name": "赵六", "Age": 9 } ] }
三、小结
通过本节例子我们发现,MongoDB有它独特的文档结构可以描述数据对象之间的一些关系特征。它虽然没有关系型数据库多表符合查询那样强大的表间查询方式,但也可以通过文档结构描述更灵活的关系特性,可以这么说,关系型数据库能做的,MongoDB基本上也可以做到。甚至有些关系数据库不容易做到的,MongoDB也可以轻松做到,比如,描述数据类的继承关系等
本站文章为和通数据库网友分享或者投稿,欢迎任何形式的转载,但请务必注明出处.
同时文章内容如有侵犯了您的权益,请联系QQ:970679559,我们会在尽快处理。