访问层轻快数据:MongoDB / .NET
MongoDB,大家都在谈论它,本文将指导您一步一步地将其集成到 Microsoft .NET 中。
MongoDB 简介
什么是 MongoDB?
MongoDB 是由 10gen 公司赞助的面向文档的数据库。它尤其被 Foursquare、SourceForge 和 bit.ly 使用。
Mongo 以 BSON 格式(支持更多值类型的二进制 JSON)存储文档,并提供一个 JavaScript shell 来访问数据和执行管理操作。它实现了包括 Java、.Net、PHP、Javascript 在内的多种驱动程序。面向文档的基本概念意味着存储的对象以 BSON 文档的形式表示(不仅仅是键/值对映射),可以轻松地映射到我们在程序中操作的对象。您可以将其比作存储一系列对象的 XML 表示。
无模式:MongoDB NoSQL 与传统关系型数据库的比较
在开发数据访问层时,我们通常需要使用 ORM,或者使用我们自己开发的映射,但这两种方法都将执行相同的任务,即处理和映射相关对象。
更像是传统的关系型数据库不允许存储复杂数据(具有表、嵌套、集合的实体),我们必须执行各种 SQL 查询来获取或更新我们的数据。
鉴于以上两点,开发数据访问层需要大量工作。如今,我们正在浪费精力来实现技术和非功能性答案,而可以将精力投入到业务开发中,从而为客户带来优势。
为此,有一种解决方案:将 .NET 对象按原样存储,并让我们的持久化引擎为我们管理这项工作。 MongoDB 和 NoSQL 数据库允许实现这一梦想。这被称为无模式(schemaless)。
MongoDB 的分片是什么意思?
MongoDB 从 1.2 版本开始就集成了分片管理。这种管理机制的实现能够实现更大的可伸缩性。我们的数据是一致的,因为它总是可以访问所有数据。分片的理念不是拥有多个主/主数据库,而是拥有一个数据库,该数据库将自己的数据分布在不同的节点上。我们会遇到在某个实例上存储一些数据,在另一个实例上存储其他数据的情况。本文不详细介绍这方面的内容。
GridFS 是什么意思?
MongoDB 内置了一个完整的文件系统。这个系统就是 GridFS。MongoDB 对每个文档的大小限制为 4MB,但我们很快就需要存储更大的文档。GridFS 就可以做到。因此,我们将大于 4MB 的任何文档存储在 GridFS 文件系统中。GridFS 还允许对文件进行分片。因此,我们不需要在机器之间进行 rsync。GridFS 可以自己完成这项工作。您可以轻松地将 Hbase 迁移到 GridFS。
高级查询系统
在我看来,MongoDB 的真正兴趣所在,尤其与 Riak 或 CouchDB 相比,是它的查询管理。它可以通过大量的关键字进行非常精细化的查询。我们可以进行类似于 SQL 的丰富查询,但所有这些都是在面向文档的数据库上进行的。
例如,可以搜索所有数组中包含多个元素的文档
db.things.find ({a: {$ all: [2, 3]}});
而在 SQL 中,我们会这样做
select * from things WHERE a LIKE '% 2%' AND has LIKE '% 3%'
但这并不完整,因为最终它会适用于一个包含数组 [32] 的“To”字段,而 SQL 也会起作用,但对于 MongoDB 查询中的情况则无效。
我们还可以通过提供来搜索
Javascript db.myCollection.find ({$ where "this.a> 3"});
它是高度模块化的,并且关键字的数量正在不断增加。
.NET 4.5 入门
有很多实用库可以与 MongoDB 通信,我建议您坚持使用 MongoDB 项目本身提供的标准驱动程序。
要实现的数据访问层架构 MongoDB
设置层
我们将使用其他 DAL 的经典机制。即在 web.config 中使用 connectionstring 来设置服务器
< connectionStrings > < add name="MongoDB" connectionString="mongodb: // localhost" > < / add > < / connectionStrings >
应用程序设置中的数据库名称
< appSettings > ... < add key="MongoDBName" value="MyTvProgram" / > < / appSettings >
在本地计算机上安装 MongoDB(单实例)
- 在开始安装之前,您必须下载最新版本的 MongoDB。为此,请访问以下地址:https://mongodb.ac.cn/downloads 并选择您想要的安装类型。
- 要开始安装,只需双击 msi 包并按照屏幕上的说明进行操作。
- 创建一个文件夹来存放您的数据库 c:\data\db 和一个日志文件 c:\data\log
- 创建一个配置文件,允许您配置 mongodb:mongod.conf
- 您可以使用 bin 文件夹中的 mongod mongod.exe 程序启动:config mongod mongod.conf
- 您也可以将 mongod 配置为服务:mongod mongod.conf config --install
- 配置 mongod 自动或手动启动:sc config mongod start=auto
在 Windows Azure 上托管带复制的 MongoDB 数据库
Windows Azure 原生不支持 MongoDB,您可以使用 mongolab SAAS 服务,但它有限制。因此,您需要创建两个基本 VM 来支持一个免费的 MongoDB 集群。
- 创建一个名为 <yourcompany> mgdb1 的 VM
- 创建另一个名为 <yourcompany> mgdb2 的 VM
- 为您的每个 VM 分配一个 30GB 的驱动器,并将其分配字母 f。
在每个 VM 上重复以下操作
- 登录到您的第一台机器
- 格式化您的数据磁盘
- 禁用 IE 增强安全配置。
- 将 http://*.mongodb.org 添加到受信任站点列表。
- 下载 64 位版本。
- 安装 MSI
- MongoDB 默认安装在 _C:\Program Files\MongoDB\Server\3.2\bin_,创建一个指向该文件的 Path 环境变量。
- 下载并安装 OpenSSL,这将允许您为复制创建证书:_https://slproweb.com/download/Win64OpenSSL_Light-1_0_2f.exe_
- 在您的 f 驱动器上创建 2 个文件夹:data 和 log
- 创建一个 conf 文件夹
- 添加一个 mongod.conf 文件
- 添加必要的参数
- Port:监听的默认端口号为 27017
- dbPath:数据路径
- replSet Rs0 =:表示将使用复制
- logpath:指定日志文件的路径
- logaappend:表示日志轮转
- 如果该节点不是第一个节点,请创建文件夹并将第一个节点的 mongodb keyfiles-file 复制过来。
- 安装 MongoDB 服务 mongod --config f:\conf\mongod.conf --install
- 启动 MongoDB 服务 net mongdb Service start mongodb
- 如果是第一个节点,请登录服务器并启动 mongo rs.initiate replication()
- 在防火墙中打开一个端口,以便连接到 MongoDB 服务。
- 为虚拟机配置 Windows Azure 上的一个端口,端口号为 TCP 27017。
- 如果是第一个节点,请在主节点上创建管理员用户。
1. use admin 2. db.createUser ({ 3. user: "siteUserAdmin" 4. pwd: "< password >" 5. Actual: [{role: "userAdminAnyDatabase" db "admin"}] 6.}); 7. db.createUser ({ 8. user: "siteRootAdmin" 9. pwd: "< password >" 10. Actual: [{role: "root", db: "admin"}] 11.});
- 停止 mongodb 实例。
- 只为第一个节点创建一个密钥文件,供复制的每个成员使用。
- 我建议使用 openssl,但您也可以使用其他机制。
- 将生成的密钥文件复制到每个成员。
- 编辑配置文件以指定要使用的密钥文件。Keyfile
- 在第一个服务器上重复此操作。
将节点添加到复制集。
- 从新节点的宿主机器上,
- 连接到第一个节点 mongo <premiernoeud> -u siteRootAdmin -p <password> --authenticationDatabase admin
- 使用 rs.add 方法 ("nomdelamachine: 27017") 添加节点。
检查复制配置。
- 从任何主机
- 连接到第一个节点 mongo <premiernoeud> -u siteRootAdmin -p <password> --authenticationDatabase admin
- 使用 rs.conf () 方法。
在 Visual Studio 2015 中开发数据访问层
- 在我们的第 1 和第 2 部分中重复创建的库,
- 在 STPVideoPlayer.DataLayer 项目中,添加以下类:
- EpisodeModel:描述一个剧集。
- LocalVideoModel:描述一个本地视频文件。
- YoutubeModel:描述一个托管在 YouTube 上的视频或播放列表。
- TimeLineModel:描述一个时间表。
- 在 STPVideoPlayer.Data.MongoProvider 项目中安装 MongoDB 驱动程序。
- 创建一个 TvPlayerRepository 类。
- 通过实现 ITvPlayerRepository 接口来实现我们 provider 的代码。