猿教程 Logo

.Net连接MongoDB

介绍

MongoDb是写这篇文章时最流行的NoSql数据库。 它被很多公司广泛的用作数据存储。 大型和小型,成熟和新兴的组织都拥抱了这种相对较新的数据库技术。 在.NET项目中存储数据的默认选项通常是SQL Server。 虽然SQL Server可能仍然是.NET开发人员最受欢迎的选择,但他们可以根据其项目需求从其他经过良好测试的替代品中进行选择。 MongoDb很容易设置并开始使用。

在本系列中,我们将探讨MongoDb的一些功能以及如何在.NET项目中使用。 另外,在这个更新的系列中,我想把更多的时间花在我们可以发送给MongoDb服务器的原始查询上。 所以首先我们将通过MongoDb shell进行一些查询和数据处理,然后我们将在.NET中转到MongoDb。

什么是MongoDb?

MongoDb是一个高度可扩展的基于文档的数据库。 这意味着它将其数据存储在文档中。 数据存储为JSON,或者以二进制JSON的形式存储,缩写为BSON。 我假设你知道JSON是什么。 这里有一个描述客户的简单示例:

{
	"name": "NoSuchCustomer Inc.",
	"number-of-employees": 100,
	"number-of-products": 10
}

在关系数据库中,如MS SQL,MySql或Oracle数据存储在表中。 表具有带有属性名称的列,然后是列,我们显示这些属性。 上述JSON可以存储在名为Customer或Customers的表中,具体取决于您的命名约定,具有3列:名称,员工人数和产品编号。 我们还将为表定义一个模式,即设置每个列的数据类型:name是varchar类型,另外两个是整数。 我们也可能有一个id类型为整数或GUID的字段。

我们可以定义一些其他约束,如name不能为null,并且我们只允许唯一的名称。 所有这些规则都成为表的模式,表中的所有记录必须遵守。 如果“name”设置为NOT NULL,则不能插入没有名称的客户端。 此外,该表将具有这3列,因此每个记录将具有这些属性。 您不能在同一张表中拥有不同数量属性的客户。

如果两个表相关,则可以使用辅助键连接。 例如。 如果客户有产品,那么可以有一个单独的产品表,每个产品记录通过customer_id辅助键链接到客户表。 这就是对象图在关系数据库中的建模。 在面向对象语言(如Java或C#)中,我们可以自由地对我们的对象进行建模,并在代码中如何相关:

public class Dog
{
	public string Name { get; }
	public string Type { get; set; }

	public Dog(string name, string type)
	{
		Name = name;
		Type = type;
	}
}

public class DogLover
{
	public string FirstName { get; }
	public string LastName { get; }
	public IEnumerable<Dog> Dogs { get; set; }

	public DogLover(string firstName, string lastName, IEnumerable<Dog> dogs)
	{
		FirstName = firstName;
		LastName = lastName;
		Dogs = dogs;
	}
}

DogLover可以在代码中的域模型中包含一组狗。 我们将如何在关系数据库中显示? 我们需要2张桌子,DogLover和Dog,并通过引用DogLover的id的辅助键将每个Dog记录链接到DogLover。 至少这将是一个可能的解决方案。 似乎不太可能,即使是最简单的层次结构,如DogLover可以有一个或多个狗可以安排在单个表中。

我们如何在非关系数据库中安排Dog / DogLover关系? 简单:与代码中所代表的方式完全相同。 JSON是一种非常灵活的数据表示技术。 以下是DogLover集合中2个条目的示例,每个所有者的狗都是嵌入式数组:

[{
	"FirstName": "Fred",
	"LastName": "Smith",
	"Dogs": [{
			"Name": "Fluffy",
			"Type": "Husky"
		}, {
			"Name": "Killer",
			"Type": "Bulldog"
		}

	]
}, {
	"FirstName": "Jane",
	"LastName": "Miller",
	"Dogs": [{
			"Name": "Max",
			"Type": "Terrier"
		}, {
			"Name": "Daisy",
			"Type": "Shepherd"
		}

	]
}]

这看起来非常像我们面向对象领域模型的更准确的表示,对吧?

MongoDb可以存储集合中的任何JSON。 我们会有单个文档的大小限制,但稍后我们会介绍。 无论如何,您需要一个非常大的对象图才能达到顶峰。

没有什么可以阻止我们向DogLover对象添加新的属性,而不用担心集合中的所有其他条目:

{
	"FirstName": "Joan",
	"LastName": "Clarke",
	"Age": 35,
	"Dogs": [{
			"Name": "Brad",
			"Type": "Dax"
		}

我们刚刚将Age添加到新条目,而之前不存在。 MongoDb不会抱怨。 任何可以在有效JSON中表示的内容都可以保存在MongoDb中。 如果我们想要,我们甚至可以做一些额外的事情,并将完全不相关的数据存储在同一个集合中。 那么在实践中不太可能发生,但是JSON的灵活性将允许我们,因此MongoDb将很乐意存储它。

优点

与传统关系数据库相比,MongoDb有一些关键优势:

  • 具有灵活模式的动态数据结构:您不需要定义列和表。 实际上,您可以在同一集合中存储任何东西

  • 由于缺乏严格的模式,数据迁移变得更加容易:如果您更改域结构,即代码中的业务对象,则文档将相应地存储对象。 您可以通过自动更改自定义对象来强制更改模式

  • 您不需要单独的表来显示如上面的DogLover / Dog集合JSON示例中所示的关系。 如果您从集合中提取单个项目,您将立即获取其关联的对象:订购所有订单项目,摇滚乐队与所有音乐会,轻松执行对这些链接对象的操作

  • 因此,MongoDb文档允许以面向对象的方式存储您的对象,这有时在SQL Server中使用单独的表和键来解决有困难和难以解决的问题

  • 由于缺少诸如次要密钥更新和删除项目等约束将更容易:没有级联删除,没有孤儿

  • 速度:MongoDb在集合中查询和插入项目非常快速和高效

  • 可扩展性:MongoDb具有高度可扩展性。 我们可以轻松地创建具有主节点和辅助节点的数据库集群,以确保我们的数据存储始终可用

  • 没有费用:MongoDb是免费的,你不需要支付一分钱来构建一个大型的MongoDb集群。 那么您可能需要为数据库服务器付费,但不需要支付任何MongoDb许可证

缺点

以上所有都是非常好的,但是有一些您需要注意的事情,如果您来自SQL Server环境 - 这可能是至少95%的.NET开发人员。

  • 缺乏专业工具:使用SQL Server,您可以使用SSMS进行一些非常高级的基于GUI的数据库操作,例如数据库分析,SQL作业,查询编辑器,IntelliSense等等。 MongoDb中没有等价物。 如果你想直接使用没有C#,Java,Php等驱动程序的集合,那么您需要在控制台窗口中编写代码或者自己开发一个自定义解决方案。 有一个可视化工具虽然可以用来改善MongoDb数据库的管理:RoboMongo。 RoboMongo是一个很好的可视化工具,可以查看MongoDb中的记录,但是它不在SQL Server Management Studio附近

  • 至于写这篇文章的时候,MongoDb不支持事务

  • 许多开发人员会说,缺少模式实际上是一个缺点:您无法通过键关联对象,您不能强制使用“NOT NULL”等规则强制性的数据结构。 然而,作为回报,您被迫在代码中实现约束,这有助于将业务逻辑集中在域层中,而不是隐藏在某些数据存储中

  • 没有存储过程和触发器

  • 很难检索丢失的数据

  • MongoDb没有对应的MS SQL商业智能工具

驱动程序

虽然您可以直接在命令窗口中与MongoDb进行交互,但您可能希望通过客户端库a.k.a驱动程序在代码中执行此操作。 大多数主流语言都有驱动程序,如C#,Java或PHP。 您可以在这里查看语言特定驱动程序的完整列表。

其他NoSql数据库

除了MongoDb之外,还有一整套NoSQL数据库。 一些例子:

  • Redis

  • CouchDB

  • Neo4j,图形数据库

  • Riak

  • RavenDb

结论

在撰写这篇文章的时候,根据db-engine,MongoDb是最受欢迎的NoSQL数据库。 即使你是一个坚定的关系数据库管理系统倡导者,并且认为您永远不会为数据存储解决方案使用任何其他数据,所以知道还有其他工具仍然是有益的。 此外,您可以拥有混合数据存储策略,您可以根据对象的性质和每个存储机制的优缺点,将一些对象存储在关系数据库管理系统和文档存储中的其他对象中。 你知道“我们一直这样做”是一种危险的心态。 学习MongoDb可以拓宽您的技能,并提供不同的观点来解决数据存储挑战。

我目前工作的公司在很大程度上接受了MongoDb。 我们还没有告别MS SQL或任何东西。 我们的核心业务仍然存储在关系表中,但是我们已经在许多应用程序中非常好地使用了MongoDb。

我们将在下一篇文章中继续执行MongoDb安装过程。


版权声明:本站所有教程均为本站原创或翻译,转载请注明出处,请尊重他人劳动果实。请记住本站地址:www.yuanjiaocheng.net (猿教程) 作者:卿文刚
本文标题: C#环境
本文地址:http://www.yuanjiaocheng.net/CsharpMongo/1.html