• 用c#操作Mongodb(附demo)


    因为需要,写了一个基于泛型的helper,这样要使用起来方便一点。

    为了大家也不重复造轮子,所以发出来希望能帮到谁。

    复杂的查询最好用linq,这也是mongodb官方建议的。

    mongodb的C#配置

    这部分很多文章都提到了,需要注意的是用的驱动与你的mongodb版本还有你.Net好像有点关系

    我是mongodb-2.x,.NET4,driver我用的是1.x系列

    2.x系列好像我这种配置用不起,大家可以试一试,貌似要.NET要4.5才行

    驱动下载地址:

    https://github.com/mongodb/mongo-csharp-driver

    这里有个小坑,mongodb的数据库连接字符串和mysql是不一样的,很多文章没有提到完整的连接字符串,花半天在官网上看到了

    mongodb://username:password@myserver:port/databaseName

    Model的编写

    其他没什么,但请注意ID、时间的类型,用的是mongdoDB自己的数据类型

    这里用了一个虚函数,是为了方便helper里面用泛型获取id

    以下是Model的源码

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using MongoDB.Driver;
    using MongoDB.Bson;
    namespace WindowsFormsApplication1.Model
    {
        public abstract class MongoModel
        { 
            public ObjectId id { get; set; } 
            public BsonDateTime created_at { get; set; }
            public BsonDateTime updated_at { get; set; } 
        }
    
     public class AccountModel : MongoModel
        {
         //例子
    public AccountModel() { } public string name { get; set; } } }

    Helper的编写

    因为mongodb的操作语句必须大量用到你的Model,因此考虑用泛型来做Helper

    用Builder模式的原因无非是觉得好玩,你可以修改代码用构造函数直接初始化

    我也没有用静态方法,你有需要可以自己修改

    以下是helper的源码

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.IO;
    using System.Xml;
    using System.Xml.Serialization;
    using MongoDB.Driver;
    using MongoDB.Bson;
    using MongoDB.Driver.Builders;
    
    namespace FrameWork
    {
        public class MongoHelper<T> where T : WindowsFormsApplication1.Model.MongoModel
        {
            public string conn;
            public string dbName;
            public string collectionName;
    
            private MongoCollection<T> collection;
    
            private MongoHelper()
            {
    
            }
    
            /// <summary>
            /// 设置你的collection
            /// </summary>
            public void SetCollection()
            {
                MongoClient client = new MongoClient(conn);
                var server = client.GetServer();
                var database = server.GetDatabase(dbName);
                collection = database.GetCollection<T>(collectionName);
            }
    
            /// <summary>
            /// 你用linq的时候会用到
            /// </summary>
            public void getCollection()
            {
                MongoClient client = new MongoClient(conn);
                var server = client.GetServer();
                var database = server.GetDatabase(dbName);
                collection = database.GetCollection<T>(collectionName);
            }
    
            /// <summary>
            /// 查找
            /// </summary>
            /// <param name="query"></param>
            /// <returns></returns>
            public T Find(IMongoQuery query)
            {
                return this.collection.FindOne(query);
            }
    
            /**
             * 条件查询用linq
             * http://mongodb.github.io/mongo-csharp-driver/1.11/linq/
             * */
            public List<T> FindAll()
            {
                return this.collection.FindAll().ToList();
            }
    
            /// <summary>
            /// 修改
            /// </summary>
            /// <param name="model"></param>
            /// <returns></returns>
            public long Update(T model)
            {
                BsonDocument doc = BsonExtensionMethods.ToBsonDocument(model);
                WriteConcernResult res = this.collection.Update(Query.EQ("_id", model.id), new UpdateDocument(doc));
                return res.DocumentsAffected;
            }
    
            /// <summary>
            /// 添加
            /// </summary>
            /// <param name="model"></param>
            /// <returns></returns>
            public bool Insert(T model)
            {
                WriteConcernResult res = this.collection.Insert(model);
                return res.Ok;
            }
    
            /// <summary>
            /// 删除
            /// </summary>
            /// <param name="model"></param>
            /// <returns></returns>
            public bool Delete(T model)
            {
                WriteConcernResult res = this.collection.Remove(Query.EQ("_id", model.id));
                return res.Ok;
            }
    
            /// <summary>
            /// 构造器
            /// </summary>
            /// <typeparam name="T"></typeparam>
            public class Builder<T> where T : WindowsFormsApplication1.Model.MongoModel
            {
                private MongoHelper<T> client;
    
                public Builder()
                {
                    client = new MongoHelper<T>();
                }
    
                public void setConn(string conn)
                {
                    client.conn = conn;
                }
    
                public void setDbName(string dbName)
                {
                    client.dbName = dbName;
                }
    
                public void setCollectionName(string collectionName)
                {
                    client.collectionName = collectionName;
                }
    
                public MongoHelper<T> build()
                {
                    client.SetCollection();
                    return client;
                }
            }
        }
    }

    Helper的使用

    很简单,我写在demo的form代码里了,注释也写的很清楚什么流程

    1.设计好你的model

    2.初始化数据库配置

    3.build一个helper

    4.调用方法

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using DevComponents.DotNetBar;
    using System.IO;
    using FrameWork;
    
    namespace WindowsFormsApplication1
    {
        /**
         * 
         * MongoDB数据库增删改查DEMO
         * 任意拷贝、修改
         * 仅供学习
         * 曾维周 16/2/25
         * 
         * App独立开发群 533838427
         * 
         * */
        public partial class MainForm : DevComponents.DotNetBar.Metro.MetroForm
        {
            public Model.ConfModel conf = new Model.ConfModel();
            private bool isFirst = true;
            private string filePath;
            private List<Model.AccountModel> accounts = new List<Model.AccountModel>();
            private FrameWork.MongoHelper<Model.AccountModel> client;
            public MainForm()
            {
                InitializeComponent();
                this.Activated += new EventHandler(Form2_Activated);
            }
    
            void Form2_Activated(object sender, EventArgs e)
            {
                if (isFirst)
                {
                    init();
                    isFirst = false;
                }
            }
    
            void init()
            {
                /**
                 * 
                 * step-1
                 * 配置你的mongodb链接
                 * 请配置完
                 * 
                 * */
                conf.mongodb_dbAddr = "localhost";
            }
    
            private void buttonX2_Click(object sender, EventArgs e)
            {
                /**
                 * 
                 * step-2
                 * 请操作前修改好你的model
                 * 
                 * step-3
                 * 用builder初始化一个helper
                 * 当然你也完全可以修改代码直接在构造函数里面初始化
                 * 我是觉得好玩
                 * 
                 * */
                FrameWork.MongoHelper<Model.AccountModel>.Builder<Model.AccountModel> builder = new FrameWork.MongoHelper<Model.AccountModel>.Builder<Model.AccountModel>();
                builder.setCollectionName("你的collection名字");
                builder.setConn(conf.mongodb_conn);
                builder.setDbName(conf.mongodb_dbName);
                client = builder.build();
            }
    
            private void buttonX1_Click(object sender, EventArgs e)
            {
                //
                Model.AccountModel account = new Model.AccountModel();
                account.name = "love";
                client.Insert(account);
    
                //
                client.Delete(account);
    
                //
                account.name = "not love";
                client.Update(account);
    
                //
                Model.AccountModel res = client.Find(MongoDB.Driver.Builders.Query<Model.AccountModel>.EQ(xx => xx.id, account.id));
    
                //强烈建议用linq进行查询操作
                //http://mongodb.github.io/mongo-csharp-driver/1.11/linq/ 
                //var query = collection.AsQueryable<Model.AccountModel>().Where(e => e.FirstName == "John");
    
            }
    
        }
    }

    参考资料

    http://mongodb.github.io/mongo-csharp-driver/1.11/linq/

    http://blog.csdn.net/haukwong/article/details/7840158

    http://www.cnblogs.com/viprx/archive/2012/09/07/2674637.html

    demo下载

    链接: http://pan.baidu.com/s/1qX3vfdE 密码: buh2

    P.S.

    希望能帮助到谁

    自己建的一个群,希望广结英豪,尤其是像我一样脑子短路不用react硬拼anroid、ios原生想干点什么的朋友。

    App独立开发群 533838427

  • 相关阅读:
    多态
    SSM前后端分离 ssm+html+js(ajax) 这种controll层的返回值是结合或者网址
    Eclipse创建ssm项目
    在idea中创建Maven项目
    Maven的安装和配置
    IDEA修改快捷键!和一些常用的快捷键
    mysql数据库的安装和连接测试并给root用户赋密码
    ssm动态sql语句
    Java基础--JDBC
    Java基础--注解、反射
  • 原文地址:https://www.cnblogs.com/matoo/p/5217922.html
Copyright © 2020-2023  润新知