ASP.NET MVC3和MongoDB数据库官方驱动的一个小例子
11.5留言:C#
11.5.1 安装C#驱动程序
C#驱动程序就是一个dll文件,可以从Github(https://github.com/mongodb/mongo-csharp-driver/downloads)上下载。网站上提供msi和zip压缩包两种格式。前者需要安装(自解压)后者需要用解压缩软件解压,根据个人喜欢自行选择,不管选择何种格式最好得到都是一样的。
这里我们选择zip格式,下载和选择合适的地方解压后得到两个文件MongoDB.Bson.dll和MongoDB.Driver.dll。其中MongoDB.Bson.dll是提供BSON序列化另外一个与数据库通信,我们需要添加这两个dll到项目的引用中。
11.5.2 使用C#驱动程序
我们需要使用添加MongoDB.Driver这个命名空间的引用来与MongoDB服务端通信:
using MongoDB.Driver;
namespace IntroMongo.Models
{
public class MongoWrapper
{
public static MongoDatabase GetDatabase()
{
MongoServerSettings settings = new MongoServerSettings();
settings.Server = new MongoServerAddress("localhost", 27017);
MongoServer server = new MongoServer(settings);
var database = server.GetDatabase("MessageDB");
return database;
}
}
}
这里,我们需要创建了一个服务器对象,并且需要设置连接字符串,端口等信息。在这个例子中,我们使用localhost作为数据库服务器地址,27017作为服务器端口,MessageDB作为数据库名称(这里最好称为集合)。
11.5.3 对象的序列化
该驱动支持文档对象序列化,只需在字段上加上相应的注解就可以完成文档库到对象的映射。这个例子中我们有两个对象:用户和评论。具体设计如下:
1.User:
using MongoDB.Bson.Serialization.Attributes;
using MongoDB.Driver;
using MongoDB.Bson;
public class User
{
public User()
{
Remarks = new List<Remark>();
}
public ObjectId id { get; set; }
[BsonElementAttribute("firstname")]
public string FirstName { get; set; }
[BsonElementAttribute("lastname")]
public string LastName { get; set; }
[BsonElementAttribute("age")]
public int Age { get; set; }
[BsonElementAttribute("createdate")]
public DateTime CreateDate { get; set; }
[BsonElementAttribute("remarks")]
public IList<Remark> Remarks { get; set; }
public string GetFullName()
{
return String.Format("{0} {1}", FirstName, LastName);
}
}
2.Remark:
using MongoDB.Bson.Serialization.Attributes;
public class Remark
{
[BsonElementAttribute("content")]
public string RemarkContent;
[BsonElementAttribute("date")]
public DateTime Date;
}
11.5.4 查询
C#官方驱动提供多种方法来访问和处理数据库,具体可以查看驱动包中CSharpDriverDocs.chm说明文档。这里我们需要查询到所有用户的集合并按照创建时间倒序显示。
var users = database.GetCollection("users").
FindAll().
SetSortOrder(SortBy.Descending("createdate"));
foreach (var user in users)
{
var userName = user["firstname"].AsString;
...
}
当然我们也可以写个稍微复杂点的查询,比如:用户名以大写字母E开头,而且创建时间必须在近7天,那么查询方法应该这么的写:
var query = Query.And(
Query.Matches("firstname", BsonRegularExpression.Create("^e")),
Query.GT("createdate",
BsonValue.Create(DateTime.Now.AddDays(-7).Date)));
var users = database.
GetCollection("users").
Find(query).
SetSortOrder(SortBy.Descending("createdate"));
11.5.5 编辑
数据的编辑分为两个步骤首先从数据库查询数据绑定到页面表单中,显示给用户供用户修改。
var objectId = ObjectId.Parse(id);
var user = MongoWrapper.GetDatabase().
GetCollection("users").
FindOneByIdAs<User>(ObjectId.Parse(id));
用户提交修改后的信息时候,这时候只需调用保存更新方法“SAVE”即可完成编辑。
var user = users.FindOneById(ObjectId.Parse(id));
user["firstname"] = userToEdit.FirstName;
user["lastname"] = userToEdit.LastName;
user["age"] = userToEdit.Age;
users.Save(user);
这里FindOneById方法获取的是一个BsonValue,其中传递的参数id需要调用ObjectId.Parse方法将string转为ObjectId。
11.5.6 插入
往数据库中写入数据时候需要创建一个新的BsonDocument,并添加到集合中去。最后通过调用“INSERT”方法写入数据库,添加用户的方法如下:
var users = database.GetCollection("users");
var user = new BsonDocument();
user["firstname"] = userToEdit.FirstName;
user["lastname"] = userToEdit.LastName;
user["age"] = userToEdit.Age;
user["createdate"] = DateTime.Now;
users.Insert(user);
11.5.7删除
删除一条记录,只需根据id去删除就可以了,具体如下:
users.Remove(Query.EQ("_id", new BsonObjectId(id)));
11.5.8 用户评论动态构建
首先要明确一点并不是每个用户都有评论,一个用户可以有多个评论。之前我们在BsonDocument添加一个值得时候,字段都是根据所给的值动态创建的,比如:
user["age"] = 18;
这里age将被动态创建,age的类型是Int32.当然如果你要检查话可以通过调用Contains对象的方法来确定一下,例如:
if (user.Contains("updatedate") && user["updatedate"].IsDateTime)
{
var updatedate = user["updatedate"].AsDateTime;
}
下面我们来看看任何给用用户添加评论,如下:
[HttpPost]
public ActionResult Index(string id, string newRemark)
{
var users = database.GetCollection("users");
var user = users.FindOneById(ObjectId.Parse(id));
var remark = new BsonDocument().
Add("content", newRemark).
Add("date", DateTime.Now);
if (user.Contains("remarks"))
{
user["remarks"].AsBsonArray.Add(BsonValue.Create(remark));
}
else
{
user["remarks"] = new BsonArray().Add(BsonValue.Create(remark));
}
users.Save(user);
return RedirectToAction("Index", new { id = id });
}
首先,我们需要检查用户对象中是否已经存在一个remarks的key,这里remarks实际上是个数组里面可能存有多条留言,每条留言有content和data两个key。如果remarks存在的话我们就继续添一个新的remark到remarks数组中,如果不存在的话我们需要创建一个新的数组然后添加。这样从数据库查询得到数据库结构将会得到类似这样的一个结果:
{
"_id" : ObjectId("4ea51941073d601758138560"),
"firstname" : "ercan",
"lastname" : "anlama",
"age" : 26,
"createdate" : ISODate("2011-10-24T07:52:33.29Z"),
"remarks" :
[
{
"content" : "this is my first remark",
"date" : ISODate("2011-10-24T07:53:22.511Z")
}
]
}
11.5.9 写在最后的话
这篇文章对MongoDB和C#的官方驱动做了一个大概的介绍,当然这些都是一些最基本的东西,属于必须要掌握的东西。
此为MongoDB还提供更强大的功能,如GridFS和MapReduce。这些功能或许能对你现在所专注的领域能起到一定的帮助。
本文参考CodeProject上Using MongoDB with the Official C# Driver文章加上自己理解谈不上翻译,简单的写写。
原文作者:Ercan Anlama(Turkey)
作者简介:I started to development during university years and worked in many freelance projects. I am working in software development more than 4 years and currently, working as analyst software developer in an Holland centre company in Istanbul, Turkey. I am interested in innovation and creativity in software development and passionate in learning new stuff.
原文网址:http://www.codeproject.com/KB/database/MongoDBWithOfficeDriver.aspx
License
版权归原作者所有。
This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)
源代码可以前往codeproject下载,或者我从我这里下载