惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

V
Visual Studio Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
N
Netflix TechBlog - Medium
博客园 - 叶小钗
大猫的无限游戏
大猫的无限游戏
S
SegmentFault 最新的问题
V
V2EX
IT之家
IT之家
J
Java Code Geeks
Hacker News - Newest:
Hacker News - Newest: "LLM"
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
GbyAI
GbyAI
D
Docker
S
Secure Thoughts
Recent Announcements
Recent Announcements
Webroot Blog
Webroot Blog
Application and Cybersecurity Blog
Application and Cybersecurity Blog
云风的 BLOG
云风的 BLOG
博客园_首页
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Security Archives - TechRepublic
Security Archives - TechRepublic
酷 壳 – CoolShell
酷 壳 – CoolShell
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
N
News | PayPal Newsroom
S
Security @ Cisco Blogs
I
InfoQ
Last Week in AI
Last Week in AI
SecWiki News
SecWiki News
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
W
WeLiveSecurity
T
Troy Hunt's Blog
Recent Commits to openclaw:main
Recent Commits to openclaw:main
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Attack and Defense Labs
Attack and Defense Labs
美团技术团队
T
The Blog of Author Tim Ferriss
Google DeepMind News
Google DeepMind News
Martin Fowler
Martin Fowler
B
Blog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Scott Helme
Scott Helme
T
Tor Project blog
Know Your Adversary
Know Your Adversary
有赞技术团队
有赞技术团队
Hugging Face - Blog
Hugging Face - Blog
Recorded Future
Recorded Future
C
Cyber Attacks, Cyber Crime and Cyber Security
AI
AI
G
Google Developers Blog

博客园 - goooto

Spring4.1新特性——Spring缓存框架增强(转) Spring整合Ehcache管理缓存(转) 《权力的游戏》第七季片场照曝光 MINA2 框架详解(转) Docker简明教程(转) IIS7.5 Gzip压缩配置 UML 依赖 关联 聚合 组合 亲属称谓 以字节流上传文件 C#命名规范(微软官方版) MongoDB学习笔记(六) MongoDB索引用法和效率分析(转) MongoDB学习笔记(五) MongoDB文件存取操作(转) MongoDB学习笔记(三) 在MVC模式下通过Jqgrid表格操作MongoDB数据(转) MongoDB学习笔记(二) 通过samus驱动实现基本数据操作(转) MongoDB学习笔记(一)MongoDB介绍及安装(转) Log4net配置相关 VS2010快捷键大全 JQuery中得到Element真实top、left、height和width属性值的对象 - goooto - 博客园 WindowsService注册
MongoDB学习笔记(四) 用MongoDB的文档结构描述数据关系(转)
goooto · 2011-05-05 · via 博客园 - goooto

MongoDB的集合(collection)可以看做关系型数据库的表,文档对象(document)可以看做关系型数据库的一条记录。但两者并 不完全对等。表的结构是固定的,MongoDB集合并没有这个约束;另外,存入集合的文档对象甚至可以嵌入子文档,或者“子集合”。他们最终都可以用类似 于BJSON的格式描述。我们今天就来分析MongoDB这一特性带来的独特数据管理方式。我们还是以samus驱动为例来分析,samus驱动支持两种 方式访问数据库,基本方式和linq方式,基本方式在上篇以介绍过,linq方式我不想单独讲解应用实例,这篇我会用两种方式来对比介绍。

一、包含子文档的集合操作

  有这么一个应用场景,某网站提供会员登录的功能,用户需要注册账号才能享受会员服务,但是注册者可能会因为用户资料表单输入项过大而放弃填写,因此用户信息分为主要资料和详细资料两项,初次注册只需要填写主要资料就行了。我们打算把详细信息设计为子文档存储。

   1) linq方式实现

  1. 新建数据描述类,描述用户信息

06    public string UserId { get; set; }
07    public string UserName { get; set; }
08    public string PassWord { get; set; }
09    public Detail Detail { get; set; }
17    public string Address { get; set; }
18    public int Age { get; set; }
19    public string Email { get; set; }

  2. 我们要新建一个用户业务操作类“UserBLL”。这个时候要让驱动知道UserInfo类描述了“用户资料”的字段信息,在GetMongo()方法实现了配置步骤,UserBLL完整代码如下:

04    public string databaseName = "myDatabase";
06    private Mongo mongo;
07    private MongoDatabase mongoDatabase;
09    //注意这里泛型类型为“UserInfo”
10    private MongoCollection<UserInfo> mongoCollection;
14        mongo = GetMongo();
15        mongoDatabase = mongo.GetDatabase(databaseName) as MongoDatabase;
16        mongoCollection = mongoDatabase.GetCollection<UserInfo>() as MongoCollection<UserInfo>;
17        mongo.Connect();
21        mongo.Disconnect();
25    /// 配置Mongo,将类UserInfo映射到集合
27    private Mongo GetMongo()
29        var config = new MongoConfigurationBuilder();
30        config.Mapping(mapping =>
32            mapping.DefaultProfile(profile =>
34                profile.SubClassesAre(t => t.IsSubclassOf(typeof(UserInfo)));
36            mapping.Map<UserInfo>();
38        config.ConnectionString(connectionString);
39        return new Mongo(config.BuildConfiguration());

  3. 接着,在“UserBLL”类中定义一个方法“InsertSomeData()”来插入一些数据:

  4. 定义一个查找数据的方法“Select”,它将查找用户详细信息中,地址在湖北的全部用户:

4public List<UserInfo> Select()
6    return mongoCollection.Linq().Where(x => x.Detail.Address == "湖北").ToList();

  5. 还定义一个删除数据的方法,将删除集合全部数据:

6    mongoCollection.Remove(x => true);

  6. 在Main方法中添加如下代码:

01static void Main(string[] args)
04    UserBLL userBll = new UserBLL();
05    userBll.InsertSomeData();
06    var users = userBll.Select();
07    foreach (var user in users)
09        Console.WriteLine(user.UserName + "是湖北人");
11    userBll.DeleteAll();

  7. 最后执行程序,打印如下信息:

   1) 普通实现

  普通方式实现不想多讲,直接贴代码,看看与linq方式有什么区别:

  最后,我们通过这段代码输出全部用户资料信息的BJSON格式:

04public void PrintBJSON()
06    string BJSON = string.Empty;
07    foreach (var documet in mongoCollection.FindAll().Documents)
10        BJSON += documet.ToString();
13    Console.WriteLine(BJSON);

  结果如下:

1{ "UserId": "1001", "UserName": "张三", "PassWord": "123456", "_id": "4d80ec1ab8a4731338000001" }
2{ "UserId": "1002", "UserName": "李四", "PassWord": "123456", "Detail": { "Address": "湖北", "Age": 20, "Email": "lisi@163.com" }, "_id": "4d80ec1ab8a4731338000002" }
3{ "UserId": "1003", "UserName": "王五", "PassWord": "123456", "Detail": { "Address": "广东", "Age": 20, "Email": "wangwu@163.com" }, "_id": "4d80ec1ab8a4731338000003" }
4{ "UserId": "1004", "UserName": "赵六", "PassWord": "123456", "Detail": { "Address": "湖北" }, "_id": "4d80ec1ab8a4731338000004" }

二、包含“子集合”的集合操作

  同样举个例子:有一个学校人事管理系统要统计班级和学生的信息,现在定义了一个“班级集合”,这个集合里面的学生字段是一个“学生集合”,包含了本班全部学生。

   1) linq方式实现

  基础配置我就不多说了,数据类定义如下:

06    public string ClassName { get; set; }
07    public List<Student> Students { get; set; }
15    public string Name { get; set; }
16    public int Age { get; set; }

  查询叫“张三”的学生在哪个班级,以及他的详细信息:

(这里其实是ToList后在内存中查的,linq方式直接查询好像驱动不支持。)

1public List<ClassInfo> Select()
3    return mongoCollection.Linq().ToList().Where(x => x.Students.Exists(s => s.Name == "张三")).ToList();

   1) 普通实现

  查询叫“张三”的学生在哪个班级,以及他的详细信息:

1public List<Document> Select()
3    var mongocollection = mongoDatabase.GetCollection("ClassInfo");
4    return mongocollection.Find(new Document { { "Students.Name", "张三" } }).Documents.ToList();

  打印数据的BJSON:

1{ "_id": "4d814bae5c5f000000005f63", "ClassName": "1001", "Students": [ { "Name": "张三", "Age": 10 }, { "Name": "李四", "Age": 0 } ] }
2{ "_id": "4d814bae5c5f000000005f64", "ClassName": "1002", "Students": [ ] }
3{ "_id": "4d814bae5c5f000000005f65", "ClassName": "1003", "Students": [ { "Name": "王五", "Age": 11 }, { "Name": "赵六", "Age": 9 } ] }

三、小结

  通过本节例子我们发现,MongoDB有它独特的文档结构可以描述数据对象之间的一些关系特征。它虽然没有关系型数据库多表符合查询那样强大的 表间查询方式,但也可以通过文档结构描述更灵活的关系特性,可以这么说,关系型数据库能做的,MongoDB基本上也可以做到。甚至有些关系数据库不容易 做到的,MongoDB也可以轻松做到,比如,描述数据类的继承关系等。

原文出处:

http://www.cnblogs.com/lipan/archive/2011/03/17/1986616.html