设为首页 收藏本站
查看: 1659|回复: 0

[经验分享] 用WPF+MongoDB开发房产信息收集器(3)——MongoDB入门

[复制链接]

尚未签到

发表于 2015-7-6 09:55:26 | 显示全部楼层 |阅读模式
  距离上一篇文字过去已经很久了。一方面是工作有点忙,另外也是遇到点问题,到现在也没有解决。这个问题我会在文章的结尾在提出来,现在先进入这篇文章的主题吧——MongoDB入门。
  由于我完全是一个彻彻底底的初学者,所以写的都只是非常非常粗浅的入门内容,各位看官不要鄙视~~~~


  • 数据库安装
    数据库的安装,网上到处都是,我也是Google的,就不哆嗦,这里上个链接吧。MongoDB 安装与启动
    另外,对于初学者来说,我觉得直接用命令行是最好的学习数据库命令的途径。但毕竟比较累。这里也推荐两个GUI的MongoDB数据库管理工具。
    1. MongoVUE 这是老外开发的一个工具。
    2. MagicMongoDBTool 这是原子里的magicDict开发的。各位可以去膜拜下~哈哈。作者已经开源了项目,有兴趣的朋友可以下载源代码自己瞅瞅。
  • 数据库连接
    在连接数据库之前,我们首先需要确定我们要用的MongoDB Driver,Driver其实有很多,但我都没有接触过,也是初学,就从官方的Driver开始吧。下载编译之后应该有两个dll文件,分别是MongoDB.Bson.dll和MongoDB.Driver.dll。
    下面是我数据库连接的代码:


    ///
    /// 连接数据库
    ///
    ///
    public static void Connect(DbInfo info)
    {
        DbHelper.info = info;
        if (info.DbType == DbType.MongoDB)
        {
            MongoServerSettings mss = new MongoServerSettings();
            mss.ConnectionMode = ConnectionMode.Direct;   // 数据库连接模式
            //mss.ConnectionMode = ConnectionMode.ReplicaSet;    // 这个是针对数据库集的(多个数据库地址)
            mss.ConnectTimeout = new TimeSpan(0, 0, 20);   // 超时时间 20s
            mss.Server = new MongoServerAddress(info.Source, info.Port);   // 数据库
            // mss.Servers是针对数据库集的
            //mss.DefaultCredentials = new MongoCredentials(info.Uid, info.Pwd, true);
            MongoServer ms = new MongoServer(mss);
            MongoDatabaseSettings mds = new MongoDatabaseSettings(ms, info.DbName);
            ms.Connect();
            db = new MongoDatabase(ms, mds);   // 保存MongoDatabase信息,以便后续调用
        }
    }
    这样连接数据库就OK了。
  • Mapping
    连接好了数据库,就需要将自己定义的类和数据进行映射了。Driver里面(MongoDB.Bson.dll)已经提供了相应的映射方法:


    BsonClassMap.RegisterClassMap(cm =>
    {
        cm.AutoMap();
    });
    另外在Mapping的时候也可以直接设置id以及id生成的方法:


    BsonClassMap.RegisterClassMap(cm =>
    {
        cm.AutoMap();
        cm.SetIdMember(cm.GetMemberMap(c => c.ID));
        cm.IdMemberMap.SetIdGenerator(StringObjectIdGenerator.Instance);
    });
    如果不在映射的时候设置,也可以在定义类时为相应的ID字段添加BsonId的属性:


    [BsonId(IdGenerator = typeof(StringObjectIdGenerator))]
    public virtual string ID { get; set; }
    通过属性,也可以设置属性不映射到数据库,那样在读写数据库的时候,该属性就会被忽略掉:


    [BsonIgnore]
    public string FavImage {get; set;}


  • 增删改查数据库
    接下去我们就可以通过Driver读写数据库了。
    在获取数据之前,我们需要获取对应类映射的Collection:


    DbHelper.db.GetCollection(name);   // name表示T映射的Collection名称
    GetCollection这个方法必须指定name参数。其实这里我觉得之前在映射的时候应该已经确定了T对应的Collection的名称,为什么这里的name必须要指定呢?还是说有其他方法我不知道的?
    MongoDB的读数据是Find命令。在Driver中也都是Find/FindAll方法。


    GetCollection().FindAll();
    在实际应用在,我们一般都是会有查询条件,以及排序条件的。
    MongoDB的查询条件是IMongoQuery,排序条件是IMongoSortBy。


    GetCollection().Find(query).SetSortOrder(sortBy);
    同时你也可以利用SetSkip和SetLimit来进行分页:


    GetCollection().Find(query).SetSortOrder(sortBy).SetSkip(skip).SetLimit(limit);
    下面的是我根据标签获取对应数据的方法,根据更新时间排序,还没有处理分页的功能:


    ///
    /// 获取标签对应的数据
    ///
    ///
    ///
    public static List Find(HouseTag ht)
    {
        QueryComplete query = null;
        if (ht != null)
        {
            query = Query.And(
                Query.GTE(HouseTag.PNameArea, ht.AreaMin),
                Query.LTE(HouseTag.PNameArea, ht.AreaMax),
                Query.GTE(HouseTag.PNamePrice, ht.PriceMin),
                Query.LTE(HouseTag.PNamePrice, ht.PriceMax),
                Query.GTE(HouseTag.PNamePriceTotal, ht.PriceTotalMin),
                Query.LTE(HouseTag.PNamePriceTotal, ht.PriceTotalMax),
                Query.GTE(HouseTag.PNameYear, ht.YearMin),
                Query.LTE(HouseTag.PNameYear, ht.YearMax)
            );
            if (!string.IsNullOrEmpty(ht.Zone))
            {
                MongoDB.Bson.BsonRegularExpression reg = new MongoDB.Bson.BsonRegularExpression(string.Format("*{0}*", ht.Zone));
                query = Query.And(query, Query.Matches(HouseTag.PNameZone, reg));
            }
        }
        return MongoHelper.FindAll(query, SortBy.Descending("UpdateTime")).ToList();
    }
    获取了数据之后,接下去就是保存数据了,保存(新增和修改)数据相对简单一点,直接用Save就好了,而且,我这里也没有处理变化的数据,每次保存都是整个对象进行了更新(就效率而言,肯定不合适,但就编程而言,那是方便不只一点点啊):


    ///
    /// 更新数据集合
    ///
    ///
    ///
    public static void Save(IEnumerable listEntity)
        where T : class, IMongoEntity
    {
        if (listEntity != null)
        {
            MongoCollection col = GetCollection();
            foreach (IMongoEntity entity in listEntity)
            {
                col.Save(entity);
            }
        }
    }
    删除数据相对更新有个差别是需要根据对应获取条件(IMongoQuery):


    ///
    // 删除数据集合
    ///
    ///
    ///
    public static void Remove(IEnumerable listEntity)
        where T : class, IMongoEntity
    {
        if (listEntity != null)
        {
            MongoCollection col = GetCollection();
            foreach (IMongoEntity entity in listEntity)
            {
                col.Remove(Query.EQ("ID", entity.ID));
            }
        }
    }
  在最后说明下我在文章开头的时候提到的之前遇到的问题。
  是这样的,我觉得这个房产信息采集器的目标用户主要是些关注房产交易信息的朋友,而这些人总不能都指望他们是IT出身,或者希望他们可以非常顺利的自己安装部署MongoDB吧。所以我就想是否可以在程序运行的时候自己去判断是否有MongoDB的服务,是否已经启动了MongoDB数据库。如果没有服务的话,创建一个服务;如果没有启动的话,就启动相应的服务。总之只要打开房产信息采集器,不需要再做其他的就直接可以用了。可是笔者尝试了n久,没能实现创建MongoDB服务的功能。
  我的想法是在发布的时候将MongoDB的相应目录也一起放在程序的根目录。然后在没有相应服务的时候,启动相应的命令行自动创建MongoDB的服务,并启动。
  所以这里有两个问题:


  • 自动创建MongoDB的服务。
  • 自动运行MongoDB的服务。
  这两个问题,当然也可以引申为创建并启动服务(包括其他任何服务)。
  不知道各位有没有什么建议或已经实现的方法?如果有的话,评论、私信都欢迎啊。最好能有现成的代码。哈哈。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-83723-1-1.html 上篇帖子: windows系统安装MongoDB 下篇帖子: MongoDB (1)---复制集与sharding安装配置
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表