设为首页 收藏本站
查看: 1690|回复: 0

[经验分享] 第四节 MongoDB复杂及变化对象的存储

[复制链接]

尚未签到

发表于 2015-7-6 05:52:25 | 显示全部楼层 |阅读模式
  本节探讨问题:

  • 复杂对象的存储
  • 存储的实体对象发生变化了
  既然要使MongoDB做业务驱动开发,那就要考虑到复杂的对象是否容易可以直接序列化存储呢?在后期的开发中,总会碰到对象的会增加或删除属性,那对象属性变动了,是否会对之前的存到MongoDB的数据反序列化会有影响呢?接下来我们就带着这些问题来简单测试一下,我也不知道是否会有问题。
  一、复杂对象的存储
  我们先来测试一些值类型的序列化问题,.net mvc中有两个方法用来将前台传回的数据绑定到对象上,TryUpdateModel(),UpdateModel(),我记得碰到日期,值类型若没赋值都会出错。而其它的序列化对数组,HashTable,日期等都要单独处理。我们来看一MongoDB是怎么处理的
  1.带参构造函数的类


class Program
{
public class Employee
{
public string Name { set; get; }
public int Age { set; get; }
public bool Sex { set; get; }
public DateTime Birthday { set; get; }
public JobBase Job { set; get; }
public Hashtable HT { set; get; }
}
public class Company
{
public string Name { set; get; }
public DateTime CreateDate { set; get; }
public List EmployeeCollection { set; get; }
public string[] Department { set; get; }
public double Rate { set; get; }
}
public class JobBase
{
public string Name { set; get; }
public Work Work { set; get; }
public void Action()
{
Console.WriteLine("我是" + this.Name);
}
}
public class Work
{
private string something;
public Work(string something)
{
this.something = something;
}
public void ToDo()
{
Console.WriteLine("我喜欢做" + something);
}
}

static void Main(string[] args)
{
Mongo mongo = new Mongo("Server=127.0.0.1:27017");
mongo.Connect();
IMongoDatabase simple = mongo["simple"];
var compCollection = simple.GetCollection();
//Company company = new Company();
//company.CreateDate = DateTime.Now;
//company.Name = "C Company";
//company.Department = new string[] { "信息部", "财务部", "开发部" };

var empCollection = simple.GetCollection();
Employee employee1 = new Employee() { Name = "llj", Age = 24, Sex = true, Birthday = new DateTime(1984, 9, 9) };
employee1.Job = new JobBase() { Name = "IT" };
employee1.Job.Work = new Work("IT杂志");
employee1.HT = new Hashtable();
employee1.HT.Add("A1", "AA1");
Employee employee2 = new Employee() { Name = "cctv", Sex = true, Birthday = new DateTime(1984, 9, 9) };
employee2.Job = new JobBase() { Name = "TEST" };
employee2.Job.Work = new Work("TEST测试");
employee2.HT = new Hashtable();
employee2.HT.Add("B1", "BB1");
Employee employee3 = new Employee() { Name = "http", Age = 24, Sex = true };
employee3.Job = new JobBase() { Name = "DEV" };
employee3.Job.Work = new Work("DEV开发");
employee3.HT = new Hashtable();
employee3.HT.Add("C3", "CC3");
//company.EmployeeCollection = new List();
//company.EmployeeCollection.Add(employee1);
//company.EmployeeCollection.Add(employee2);
//company.EmployeeCollection.Add(employee3);
//compCollection.Save(company);

empCollection.Save(employee1);
empCollection.Save(employee2);
empCollection.Save(employee3);
Console.WriteLine("Count: {0}", empCollection.Linq().Count());
//选择一个对象查看
Employee employee=empCollection.FindOne(new Document{{"Name","llj"}});
//Company companyNew = compCollection.FindOne(new Document{{"Name","C Company"}});
//companyNew.EmployeeCollection[0].Job.Action();
//companyNew.EmployeeCollection[0].Job.Work.ToDo();
mongo.Disconnect();
mongo.Dispose();
Console.ReadLine();
}
}  程序出错了,原因是Work这个类是带参的构造函数的,也说你的对象是通过带参的构造函数创建的被保存Mongo中,再反射回来时会出错的。见下面
DSC0000.png
  我们注掉Work类的所有代码,继续测试 db.Employee.drop()
  2.值类型及日期的测试

DSC0001.gif DSC0002.gif View Code

class Program
{
public class Employee
{
public string Name { set; get; }
public int Age { set; get; }
public bool Sex { set; get; }
public DateTime Birthday { set; get; }
public JobBase Job { set; get; }
public Hashtable HT { set; get; }
}
public class Company
{
public string Name { set; get; }
public DateTime CreateDate { set; get; }
public List EmployeeCollection { set; get; }
public string[] Department { set; get; }
public double Rate { set; get; }
}
public class JobBase
{
public string Name { set; get; }
public void Action()
{
Console.WriteLine("我是" + this.Name);
}
}

static void Main(string[] args)
{
Mongo mongo = new Mongo("Server=127.0.0.1:27017");
mongo.Connect();
IMongoDatabase simple = mongo["simple"];
var compCollection = simple.GetCollection();
//Company company = new Company();
//company.CreateDate = DateTime.Now;
//company.Name = "C Company";
//company.Department = new string[] { "信息部", "财务部", "开发部" };

var empCollection = simple.GetCollection();
Employee employee1 = new Employee() { Name = "llj", Age = 24, Sex = true, Birthday = new DateTime(1984, 9, 9) };
employee1.Job = new JobBase() { Name = "IT" };
employee1.HT = new Hashtable();
employee1.HT.Add("A1", "AA1");
Employee employee2 = new Employee() { Name = "cctv", Sex = true, Birthday = new DateTime(1984, 9, 9) };
employee2.Job = new JobBase() { Name = "TEST" }; ;
employee2.HT = new Hashtable();
employee2.HT.Add("B1", "BB1");
Employee employee3 = new Employee() { Name = "http", Age = 24, Sex = true };
employee3.Job = new JobBase() { Name = "DEV" };
employee3.HT = new Hashtable();
employee3.HT.Add("C3", "CC3");
//company.EmployeeCollection = new List();
//company.EmployeeCollection.Add(employee1);
//company.EmployeeCollection.Add(employee2);
//company.EmployeeCollection.Add(employee3);
//compCollection.Save(company);

empCollection.Save(employee1);
empCollection.Save(employee2);
empCollection.Save(employee3);
Console.WriteLine("Count: {0}", empCollection.Linq().Count());
//选择一个对象查看
Employee employee=empCollection.FindOne(new Document{{"Name","llj"}});
//Company companyNew = compCollection.FindOne(new Document{{"Name","C Company"}});
//companyNew.EmployeeCollection[0].Job.Action();
mongo.Disconnect();
mongo.Dispose();
Console.ReadLine();
}
}  查看结果:
DSC0003.png
  我们可以看到,未设置年龄,日期的字段,Mongo都会处理为0和一个指定日期,而HashTable也是可以被自动序列化进来的。
  那再把看一下取出来的对象被还原成什么样了,
DSC0004.png
  3.组合子对象,增加集合测试

View Code

class Program
{
public class Employee
{
public string Name { set; get; }
public int Age { set; get; }
public bool Sex { set; get; }
public DateTime Birthday { set; get; }
public JobBase Job { set; get; }
public Hashtable HT { set; get; }
}
public class Company
{
public string Name { set; get; }
public DateTime CreateDate { set; get; }
public List EmployeeCollection { set; get; }
public string[] Department { set; get; }
public double Rate { set; get; }
}
public class JobBase
{
public string Name { set; get; }
public void Action()
{
Console.WriteLine("我是" + this.Name);
}
}

static void Main(string[] args)
{
Mongo mongo = new Mongo("Server=127.0.0.1:27017");
mongo.Connect();
IMongoDatabase simple = mongo["simple"];
var compCollection = simple.GetCollection();
Company company = new Company();
company.CreateDate = DateTime.Now;
company.Name = "C Company";
company.Department = new string[] { "信息部", "财务部", "开发部" };
Employee employee1 = new Employee() { Name = "llj", Age = 24, Sex = true, Birthday = new DateTime(1984, 9, 9) };
employee1.Job = new JobBase() { Name = "IT" };
employee1.HT = new Hashtable();
employee1.HT.Add("A1", "AA1");
Employee employee2 = new Employee() { Name = "cctv", Sex = true, Birthday = new DateTime(1984, 9, 9) };
employee2.Job = new JobBase() { Name = "TEST" }; ;
employee2.HT = new Hashtable();
employee2.HT.Add("B1", "BB1");
Employee employee3 = new Employee() { Name = "http", Age = 24, Sex = true };
employee3.Job = new JobBase() { Name = "DEV" };
employee3.HT = new Hashtable();
employee3.HT.Add("C3", "CC3");
company.EmployeeCollection = new List();
company.EmployeeCollection.Add(employee1);
company.EmployeeCollection.Add(employee2);
company.EmployeeCollection.Add(employee3);
compCollection.Save(company);
Company companyNew = compCollection.FindOne(new Document { { "Name", "C Company" } });
companyNew.EmployeeCollection[0].Job.Action();
mongo.Disconnect();
mongo.Dispose();
Console.ReadLine();
}
}  看一下结果:
DSC0005.png
  可以看到List集合,字符串数组,组合类都已成功序列化保存到Mongo中了,那我们在还从Mongo把这个对象取出来
DSC0006.png
  对象被成功的还原回来了,那我们修改现在的对象属性,去掉Company的Department属性,以及Employee的JobBase属性看看还原后的情况
  4.增删属性再还原对象

View Code

public class Employee
{
public string Name { set; get; }
public int Age { set; get; }
public bool Sex { set; get; }
public DateTime Birthday { set; get; }
//public JobBase Job { set; get; }
public Hashtable HT { set; get; }
}
public class Company
{
public string Name { set; get; }
public DateTime CreateDate { set; get; }
public List EmployeeCollection { set; get; }
//public string[] Department { set; get; }
public double Rate { set; get; }
}  查看结果,看看是否会影响对象成功还原
DSC0007.png
  对象成功还原了,少掉那部分属性。那我们再将对象保存回去,看看Mongo会将那部分多出来的属性丢弃吗?为了表现明显,我们将Company的List属性也注释掉
  执行以下代码

View Code

Company companyNew = compCollection.FindOne(new Document { { "Name", "C Company" } });
compCollection.Update(companyNew, companyNew);  查看结果Mongo中的结果:
DSC0008.png
  读取后的对象被保存回去会将原先的多出的属性数据丢弃。
  总结:经过测试,Mongo可存取复杂的对象(对象中不包含其它带参构造函数,影响到还原),包括数组,泛型集合,哈希表,值类型等等。非空字段Mongo会自动匹配一些特定的值。但是当对象本身发生变化了,比如删除属性后,读取后再更新回去,会导致原先的多出的属性丢失,因此开发中要考虑到对象变了之后,之前的数据是否要保留下来,做好备份。Mongo要求存储的对象要尽量相对稳定或者结构相对简单,否则前期的业务对象设计要花大量时间了。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-83478-1-1.html 上篇帖子: mongoDB 介绍(特点、优点、原理) 下篇帖子: Mongodb之(小试牛刀)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表