在 .NET 中使用 Web API 连接到 MongoDB
MongoDB是一种非常流行的NoSQL数据库,其用户基数以及功能列表同时都在迅猛增长中。 MongoDB可从这里下载安装。如果你并不想为了试验而安装MongoDB,你还可以使用MongoDB服务托管提供商。在本演示中,我们将使用MongoHQ,下面我们就来开始在MongoHQ上设立MongoDB。
MongoHQ入门 – 云中的MongoDB
开始使用MongoHQ我们就先要进行注册。通过接下来的几个步骤,我们就能走完从注册一直到创建出一个数据库所需的过程。
第1步:首先你要输入下列信息。
第2步:当你点击Create Account按钮之后,下一步就需要你输入你的信用卡的信息,但这一步不是必需的,你可以跳过这一步,暂时选择试用免费版。
第3步:此时你将在屏幕上看到,可以创建你的数据库了。现在先不要完成这一步。在屏幕的右上角,你能看到你的账户名称,点击它得到一个下拉菜单,然后鼠标单击Account Settings。
很重要的一点是,你要先设置好Default Database User(缺省数据库用户)。输入适当的用户名和秘密并把你输入的这两项内容记下来,比如你可以将这两项内容设置为(administrator/password).
第5步:现在你可以单击右上角的Create Database(创建数据库)按钮,从而转到New Database(新建数据库)屏幕。
第6步:在New Database页面,选择你想使用的主机类型。我选择的是目前可免费使用的512MB的选项。你还要指定你的数据库名称,比如,可指定为MyFirstDb。单击Create Database按钮来完成DB创建过程。
一旦数据库创建完成,你就可看到如下所示的对话框:
第7步:将Mongo URI记下来,后面你会用到它。现在我们的MongoDB实例就准备完毕了。
建立Web API
既然搞到了一个可以使用的MongoDB实例,现在我们就可以建立起向该实例发送数据和从该实例中获取数据的Web API了。
第1步: 使用基本模版(或者是Web API模版)创建一个新的MVC 4 project。
第2步: 添加一个空白的叫做MongoDbController的WebAPiController。
第3步: 在Web.Config中,添加上面第7步中的连接字符串。如下所示,其中还要包括你所输入的用户名和口令:
要用你的所输入的口令代替其中的‘xxxxxxxx’。
第4步: 使用下列命令从Nuget安装MongoDB的驱动程序:
PM> Install-Package mongocsharpdriver第5步: 在MongoDbController中,添加一个叫做MongoDatabase类型的字段并用RetrieveMongohqDb方法对它进行初始化。
readonly MongoDatabase mongoDatabase; public MongoDbController() { mongoDatabase = RetreiveMongohqDb(); }
RetrieveMongohqDb方法使用我们在Web.Config中添加的连接字符串新建了一个MongoClient的实例,然后使用mongoClient这个新实例获取到MongoServer,最后它从服务器中取到了我们的数据库(MyFirstdb)。这可以保证,每次Controller被调用到时,MongoDb都会准备好以供我们使用。理想情况下应该把取得的数据库放入一个Repository之中,但现在这里只是个演示代码。
private MongoDatabase RetreiveMongohqDb() { MongoClient mongoClient = new MongoClient( new MongoUrl(ConfigurationManager.ConnectionStrings ["MongoHQ"].ConnectionString)); MongoServer server = mongoClient.GetServer(); return mongoClient.GetServer().GetDatabase("MyFirstDb"); }
第6步: 添加一个数据模型实体,这在MongoDB中称为document,其属性如下所示:
public class Contact { [BsonId] public string Id { get; set; } public string Name { get; set; } public string Address { get; set; } public string Email { get; set; } public string Phone { get; set; } }
BsonId属性是由MongoDb驱动程序提供的。在保持数据时,它会被会从字符串转化为一个MongoDB能够理解的Id;在载入/读取数据时,它又会被从Id转换回字符串。
第7步:实现获取所有数据的请求 - 我们将创建一个从数据库中获取所有联系人的Get方法。既然我们用的是WebApi Controller,那么我就可以简单地将从数据库中返回的数据转化为可枚举集合作为该方法的处理结果返回。该方法返回的Enumerable是Contact对象的List。
public IEnumerableGetAll() { List model = new List (); var contactsList = mongoDatabase.GetCollection("Contacts").FindAll().AsEnumerable(); model = (from contact in contactsList select new Contact { Id = contact["_id"].AsString, Name = contact["Name"].AsString, Address = contact["Address"].AsString, Phone = contact["Phone"].AsString, Email = contact["Email"].AsString }).ToList(); return model; }
第8步:创建或更新Contact – 记下来我们添加一个 HttpPost方法,它可接受一个Contact对象,并可根据该对象是否具有一个Id来决定,是要创建一个新联系人还是要对已有联系人进行更新。完成这个任务的代码如下所示:
public Contact Save(Contact contact) { var contactsList = mongoDatabase.GetCollection("Contacts"); WriteConcernResult result; bool hasError = false; if (string.IsNullOrEmpty(contact.Id)) { contact.Id = ObjectId.GenerateNewId().ToString(); result = contactsList.Insert(contact); hasError = result.HasLastErrorMessage; } else { IMongoQuery query = Query.EQ("_id", contact.Id); IMongoUpdate update = Update .Set("Name", contact.Name) .Set("Address", contact.Address) .Set("Phone", contact.Phone) .Set("Email", contact.Email); result = contactsList.Update(query, update); hasError = result.HasLastErrorMessage; } if (!hasError) { return contact; } else { throw new HttpResponseException(HttpStatusCode.InternalServerError); } }
理想情况下我们可以对数据持久化逻辑进行分离处理并将它们放入一个Repository,我们应该把这个方法一分为二,一个方法用于插入数据,另一个用于对数据进行更新。要进行插入的条件很简单,如果收到的Contact对象没有Id,我们就创建一个新Id并将该对象发送给服务器;如果收到的Contact对象具有一个Id,我们就用contact.Id新建一个IMongoQuery对象,然后对IMongoUpdate实例中需要更新的属性进行赋值。
最后,由contactsList这个collection使用相应的查询实例以及更新实例除非真正的更新动作。我们可以通过对result.HasLastErrorMessage进行检查来验证插入或更新是否成功。
上面就是我们所有的代码。由于我们没有创建相应的UI,所以下面我将用Fiddler来进行测试。
对我们的Web API进行测试
运行该应用会显式出一个著名的YSOD出错屏,报告未找到相应的资源。
转到/api/MongoDb/这个URL(例如 http://localhost:61093/api/MongoDb/),IE会下载相应的Json。第一次这个Json数组为空。
记下来我们用Fiddler的Composer组织出一个PUT请求,以JSON的格式向数据库发送一个联系人的信息。
现在再来执行一次Get请求,我们就能够看到返回的是包含如下所示数据的Json。
最后,我们使用Fiddler重新组织一个POST请求,只把联系人的名字从Suprotim改为Supro并发出该Post请求。这次后端的执行路径会走到else那里,因为这次联系人具有一个与之关联的Id。结果,该联系人的信息得到了更新。
你还可以使用MongoHq的dashboard完成与此相同的验证过程。真酷!
结束语
作为一种NoSql文档数据库,MongoDB越来越受欢迎了。尤其是在需要快速数据存取但数据报告的速度并不作为评判标准情况下,它更受欢迎。今天我们蜻蜓点水式地讲解了如何通过使用Web API从.NET中同MongoDB建立连接。我们采用的是一种免费的托管式解决方案。未来我们还会对如何使用本地MongoDB实例来完成该Demo进行探讨。
完整下载本文所有的源代码 (Github)