Mongodb学习笔记五(C#操作mongodb)

Mongodb学习笔记五(C#操作mongodb)

mongodb c# driver(驱动)介绍

目前基于C#的mongodb驱动有两种,分别是官方驱动(下载地址)和samus驱动(下载地址)。
本次我们只演示官方驱动的使用方法。
官方驱动文档查看

第一步:引用驱动dll

引用驱动有两种方式:
1. 根据上面的下载地址下载对应的版本,然后引用到项目中。
2. 在项目的引用上右击->管理NuGet程序包(首先确保安装了nuget扩展包)->联机搜索官方驱动dll(搜索条件是 “Official MongoDB”)->安装成功后会引用3个dll(MongoDB.Driver和MongoDB.Bson,Newtonsoft.Json)。

Mongodb学习笔记五(C#操作mongodb)

第二步:构造MongodbHelper类

代码如下:

using MongoDB.Driver;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Server.DAL.DBHelper
{
    public sealed class MongodbHelper
    {
        static public readonly MongodbHelper Instance = new MongodbHelper();
        private MongoDatabase db;

        private MongodbHelper()
        {
            //http://www.studyofnet.com/news/337.html
            //mongodb://[username:password@]host1[:port1][,host2[:port2],…[,hostN[:portN]]][/[database][?options]]
            string strconn = "mongodb://sa:123456@127.0.0.1:27017";
            string dbName = "test";
            MongoDB.Driver.MongoClient mongoClient = new MongoClient(strconn);
            MongoServer server = mongoClient.GetServer();
            db = server.GetDatabase(dbName);
        }

        public MongoDatabase DB
        {
            get { return db; }
        }

        public MongoCollection this[string value]
        {
            get
            {
                return db.GetCollection(value);
            }
        }

     }
}

第三步:添加实体对象

在此建立的是一个复杂person对象,如下代码:

 public class Test:BaseEntity
{
}
public class PersonType : BaseEntity
{
    public string Code { get; set; }
    public string Display { get; set; }
}
public class Person : BaseEntity
{
    //如果对应多个分类,则格式为:,3,34,2
    public string PersonType { get; set; }
    public string Name { get; set; }
    public bool Sex { get; set; }
    public int Age { get; set; }
   //默认是国际时间
        [MongoDB.Bson.Serialization.Attributes.BsonDateTimeOptions(Kind = DateTimeKind.Local)]
    public DateTime AddTime { get; set; }
    public List<Address> Addresses { get; set; }
    public List<string> Courses { get; set; }
}

public class Address
{
    public string Province { get; set; }
    public string City { get; set; }
}

 

BaseEntity说明

BaseEntity中放的是mongodb数据库中自动生成的_id(类型是ObjectId)

 public class BaseEntity
{
    /// <summary>
    /// 字段映射,告诉mongodb这个字段在数据库中对应_id
    /// </summary>
    [BsonId]
    //告诉mongodb这个字段在数据库中的类型是ObjectId
    [BsonRepresentation(BsonType.ObjectId)]
    public string _id { get; set; }
}

第四步:创建ApiController

创建ApiController基类BaseApiController

BaseApiController中会初始化一些变量,代码如下:

 public class BaseApiController : ApiController
    {      
        public int skip, take;
        public MongoDatabase db;
        public MongoCollection col = null;//用于直接返回查询的json       
        public BaseApiController(string collectionName)
        {          
            skip = GetIntRequest("skip");
            take = GetIntRequest("take");
            if (skip == 0 && take == 0)
            {
                take = int.MaxValue;
            }

            db = Server.DAL.DBHelper.MongodbHelper.Instance.DB;
            col = db.GetCollection(collectionName);
        }
        public string GetStringRequest(string paramter)
        {
            return HttpContext.Current.Request.QueryString[paramter] ?? "";
        }
        public int GetIntRequest(string paramter)
        {
            string tmp = HttpContext.Current.Request.QueryString[paramter] ?? "";
            int tag = 0;
            int.TryParse(tmp, out tag);
            return tag;
        }
    }   

创建TestController继承BaseApiController

我们就用TestController来演示CURD.
具体代码如下,不再做详细说明:

public class TestController : Filter.BaseApiController
{
    public TestController()
        : base("Person")
    {
    }

    public string Post([FromBody]object value)
    {           
        var model = JsonConvert.DeserializeObject<Person>(value.ToString());
        model._id = ObjectId.GenerateNewId().ToString();
        try
        {
            col.Insert(model);
            return model._id;
        }
        catch (WebException ex)
        {
            throw ex;
        }
    }       
    public object Get()
    {
        try
        {
            IEnumerable<Person> queryable = col.AsQueryable<Person>();
            Func<Person, bool> where = null;

            //有多少条件并多少条件

            //like
            //var name = GetStringRequest("Name");
            if (!string.IsNullOrEmpty(name))
            {
                where = c => c.Name.Contains(name);
                queryable = queryable.Where(where);
            }
            //单个条件等值查询
            var personType = GetStringRequest("personType");
            if (!string.IsNullOrEmpty(personType))
            {
                where = c => c.PersonType == personType;
                queryable = queryable.Where(where);
            }
            //嵌套数组查询
            var course = GetStringRequest("course");
            if (!string.IsNullOrEmpty(course))
            {
                where = c => c.Courses.Contains(course);
                queryable = queryable.Where(where);

            }
            //嵌套实体集合查询---查数量
            var address = GetStringRequest("address");
            if (!string.IsNullOrEmpty(address))
            {
                where = c => c.Addresses.Count > GetIntRequest("address");
                queryable = queryable.Where(where);

            }
            var personList = queryable.OrderByDescending(c => c._id).Skip(skip).Take(take).ToList();
            var count = queryable.Count();

            var data = new { count = count, dataList = personList };
            return data;
        }
        catch (WebException ex)
        {
            throw ex;
        }
    }

    public Person Get(string id)
    {
        try
        {
            var model = col.AsQueryable<Person>().FirstOrDefault(c => c._id == id);
            return model;
        }
        catch (WebException ex)
        {

            throw ex;
        }
    }

    //部分字段修改模式,只修改需要修改的字段。缺点是只能修改单个属性,对于嵌套数组和嵌套实体集合无法修改
    public int Put(string id, [FromBody]object value)
    {
        try
        {               
            var query = new QueryDocument { { "_id", ObjectId.Parse(id) } };
            var dicData = JsonConvert.DeserializeObject<Dictionary<string, object>>(value.ToString());
            var update = new UpdateDocument { { "$set", new QueryDocument(dicData) } };
            col.Update(query, update);
            return 1;
        }
        catch (WebException ex)
        {
            throw ex;
        }

    }

    //完全修改模式,先查后改,支持任意类型的对象的修改。缺点是需要先查询一次
    public int Put([FromBody]object value)
    {
        try
        {
            var model = JsonConvert.DeserializeObject<Person>(value.ToString());
            col.Save(model);
            return 1;
        }
        catch (WebException ex)
        {

            throw ex;
        }

    }
    public void Delete(string id)
    {
        try
        {
            var query = new QueryDocument { { "_id", ObjectId.Parse(id) } };
            col.Remove(query);              
        }
        catch (WebException ex)
        {

            throw ex;
        }
    }
}

第五步:CURD演示

在这里我们使用一个工具Fiddler2演示。

添加

Mongodb学习笔记五(C#操作mongodb)

Mongodb学习笔记五(C#操作mongodb)