Mongodb心仪了很久但是一直没有动手来写,今天看到官方的文档说到了C#的Driver于是看了下,因为这
个小项目中使用的SQL但是因为懒得写数据库的语句就采用了CF的方式进行生成,什么都交给EF来处理感觉的确很爽,但是系统的性能也卡在了LINQ上,这就叫有得必有失吧~对于Mongo因为其面向文档,在C#中我们的类定义就是一个文档的基础骨架,因此,如果直接使用Mongodb将现有系统中的数据库替换不掉应该不会有问题~于是,先建立一个小的项目试验下,但是还是遇到了一堆问题
1 开启
默认的情况下你需要开启Mongodb的service,但是我这里命令行如何都打不开,错误原因是/data/db不存在,这里说明下,mongodb会自动在c盘寻找这个文件夹,而不会自己创建,但是如果你希望数据保存在别的地方,需要手动参数设置。但是,我的C盘的确存在这个文件夹,问题不得其解,后来发现需要管理员权限,因此使用管理员权限启动命令行就行了。因为这个mongod是提供service的,所以不能关闭,你可以使用mongo进行对数据库的操作
2 _id
不管你愿不愿意,将任何的东西存入数据库以后都会自动刚建立一个相应的唯一的_id,同时当你使用FindAll()查找某一个集合以后,这个也是会返回的,因此,你需要在数据库文档对应的类中定义一个ID属性,当然也可以是其他的名字,建议使用string,不过Bson(mongodb提供一种BsonObjectId的类型,貌似使用这个类型也不行)中没有自动转换,所以在建立或是初始哈数据库的时候需进行映射,设置为string类型,当然这个解决方法可以在google group中找到,我也是通过这里发现的,这里给出一个示例:
using System;
using MongoDB.Bson;
using MongoDB.Bson.DefaultSerializer;
using MongoDB.Driver;
using MongoDB.Driver.Builders;
namespace ConsoleApplication1 {
public class NoDeps {
public string MyId;
public string OtherData;
}
public static class Program {
public static void Main(string[] args) {
InitializeClassMaps(); // only do this once
var server = MongoServer.Create("mongodb://localhost/?safe=true");
var database = server["test"];
var collection = database.GetCollection("test");
collection.RemoveAll();
var document = new NoDeps { OtherData = "abc" };
collection.Insert(document); // assigns Id automatically
document = collection.FindOne();
}
private static void InitializeClassMaps() {
BsonClassMap.RegisterClassMap(cm => {
cm.AutoMap();
var idMember = cm.GetMemberMap(c => c.MyId);
cm.SetIdMember(idMember);
idMember.SetRepresentation(BsonType.ObjectId);
});
}
}
}
3 迭代器
因为我使用的是MVC项目做测试,前台的Razor使用迭代来进行显示,即使用foreach来逐个显示,因为是刚接触,开始写成了BsonCollection<T>来返回视图,但是发现这个只是一个类,你需要使用它的方法FindAll()或是建立一个Query来回去一个游标,这个可以使用foreach进行迭代~即你需要返回一个BsonCursor<T>,有点数据库的意思~呜哈哈,回忆起来数据库的范式~真的是联想起来没有边际
4 不能使用Html.Editor
因为你需要使用Mongo的类型,所以这些语法糖就不再适用了,估计能够通过重载来解决这个问题,以后试一下
现在就写这么多,更多的问题肯定是接二连三,以后再慢慢总结~
其实使用Mongodb只是想试一下这个面向文档的数据库的便捷,但是并不是所有的项目都能使用Mongodb,起码在正式项目里使用就需要三思,因为这些技术如果遇到了问题能够帮你解决的人不多,做第一个吃螃蟹的人就要承担未知的风险,突然想起来foursquare的那次事件,虽然说是因为sharding 没有做好引起的,但是同样可以看出对于这些新技术一旦出现问题的无助~