Magicshui's Blog

Magicshui on Programming && Life

不能这么办

这段时间开始想下一步学什么,现在基本确定了,我更多是想涉猎技术,到稳定的年纪再去深究,于是各种技术都来了,但是也不得不面对一个现实就是你在这些技术中获得了什么?不能只是hello world的快感吧,那你就完全脱离社会了,应该真的去做一些脚踏实地的东西~

当然我不喜欢北大青鸟的那种教育出来的人基本上都是码农(自然有好的,我只是举个不恰当的例子),缺乏个人的见解很难让你能够看透编程或是系统背后的目的,自然也就会随着大家人云亦云,这叫没主见。

但是自己也同样不喜欢脱离实际的去追求,作为一个要踏入社会的人自然需要一个能够证明自己的机会,不管是什么样的机会,有总比没有好~

总是在将要浮躁的时候需要这样提醒自己:异想天开、脚踏实地

刚开始用Mongodb遇到的问题以及解决

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 没有做好引起的,但是同样可以看出对于这些新技术一旦出现问题的无助~

MVC3在服务器上的部署问题

有一个项目使用MVC3编写,因为调试都是在Vs中进行的集成,所以一直都是顺利的进行着,现在项目进搜狗截图_2011-04-09_17-05-43行到了尾声,需要在服务器上部署,而我的本地IIS上是没有问题的,因为以前安装过WebMaxtrix,所以它都自动帮我配置过了,但是现在放到同学的电脑上,问题接二连三~记录下,为了给碰到同样问题的童鞋~

首先,我们保证程序是完全正确的,起码能够在测试的时候不会起不开或是没法运行~

然后,对于安装了.NET 4的童鞋,需要运行aspnet_regiis.exe -i这个命令,他将会自动安装.NET4

接下来打开IIS管理面板,然后打开ISAPI和CGI限制,启动ASP.NET v4.0

新添加的网站要在应用程序池中设置为集成、以及.v4~而且认证方式设置为Local System,对于认证用户建议使用本地的管理员,需要设置密码,如果你的管理员账户没有密码就自己先设置一个先,毕竟服务器上是要求密码的~

最后就是重启就行了~