MongoDB.Driver 2.4以上版本 在.NET中的基本操作

MongoDB.Driver是操作mongo数据库得驱动,最近2.0以下版本已经从GitHub和Nuget中移除了,也就是说.NET Framework4.0不再能从官方获取到MongoDB得驱动了,其次MongoDB.Driver2.0开始API变更巨大,本文不适用MongoDB.Driver2.0以下版本,亦不适用.NET Framework4.5以下版本

要在.NET中使用MongoDB,就必须引用MongoDB的驱动,使用Nuget安装MongoDB.Driver是最方便得,目前Nuget支持的MongoDB程序包有对.NET Framework4.5以上版本的依赖

安装完成之后会在引用中新增三个MongoDB得程序集引用,其中MongoDB.Driver.Core在2.0版本以下是没有得

先构建一个实体基类,因为Mongo要求每个文档都有唯一Id,默认为ObjectId类型(根据时间Mac地址Pid算出来的,类似GUID,适用于分布式),在这个基类中添加Id属性

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

namespace MongoTest
{
    /// <summary>
    /// 自定义类型Id
    /// </summary>
    /// <typeparam name="T"></typeparam>
    public abstract class BaseEntity<T>
    {
        public T Id { get; set; }
    }
    /// <summary>
    /// Mongo默认填充ObjectId类型的Id
    /// </summary>
    public abstract class DefaultIdEntity : BaseEntity<ObjectId>
    {
    }
}

开始构建数据库访问类DbContext

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

namespace MongoTest
{
    public class DbContext
    {
        public readonly IMongoDatabase _db;
        public DbContext()
        {
            //此为开启验证模式 必需使用用户名 密码 及指定登陆的数据库 可采用,分割连接多个数据库
            var client = new MongoClient("mongodb://root:[email protected]:27017/admin");
            //未开启验证模式数据库连接
            // var client = new MongoClient("mongodb://127.0.0.1:27017");
            //指定要操作的数据库
            _db = client.GetDatabase("mytest");
        }

        private static string InferCollectionNameFrom<T>()
        {
            var type = typeof(T);
            return type.Name;
        }

        public IMongoCollection<T> Collection<T, TId>() where T : BaseEntity<TId>
        {
            var collectionName = InferCollectionNameFrom<T>();
            return _db.GetCollection<T>(collectionName);
        }
        /// <summary>
        /// 实体类名和数据库中文档(关系型数据库中的表)名一致时使用
        /// </summary>
        public IMongoCollection<T> Collection<T>() where T : DefaultIdEntity
        {
            var collectionName = InferCollectionNameFrom<T>();
            return _db.GetCollection<T>(collectionName);
        }

        public IMongoCollection<T> Collection<T, TId>(string collectionName) where T : BaseEntity<TId>
        {
            return _db.GetCollection<T>(collectionName);
        }
        /// <summary>
        /// 实体类名和数据库中文档(关系型数据库中的表)不一致时使用,通过collectionName指定要操作得文档
        /// </summary>
        public IMongoCollection<T> Collection<T>(string collectionName) where T : DefaultIdEntity
        {
            return _db.GetCollection<T>(collectionName);
        }
    }
}

现有数据库数据 文档book 包含数据如下

开始构建与文档对应得实体,mongo是文档数据库,的单词得大小写是敏感得,所以构建得实体的字段也应该是小写得,有点不符合习惯

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

namespace MongoTest
{
    public class book : DefaultIdEntity
    {
        public string title { get; set; }
        public double price { get; set; }
        public string author { get; set; }
        public string publisher { get; set; }
        public int saleCount { get; set; }
    }
}

现在开始增删查改操作,其中查找和删除得filter有两种形势,lambda和Definition

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

namespace MongoTest
{
    public class OperatDb
    {
        static IMongoCollection<book> bookDao;
        static OperatDb()
        {
            bookDao = new DbContext().Collection<book>();
        }

        public static void Excute()
        {
            Console.WriteLine();
            QueryAll();
            Console.WriteLine();
            Query();
            Console.WriteLine();
            Insert();
            Console.WriteLine();
            QueryAll();
            Console.WriteLine();
            Update();
            Console.WriteLine();
            Delete();
            Console.WriteLine();
            QueryAll();
            Console.ReadKey();
        }
        public static void QueryAll()
        {
            var books = bookDao.Find(x => true).ToList();
            foreach (var item in books)
            {
                Console.WriteLine(item.ToString());
            }
        }

        public static void Query(System.Linq.Expressions.Expression<Func<book, bool>> filter = null)
        {
            if (filter == null) filter = x => x.author == "韩寒";
            var books = bookDao.Find(filter).ToList();
            foreach (var item in books)
            {
                Console.WriteLine(item.ToString());
            }
        }

        public static void Update()
        {
            var filter = Builders<book>.Filter.Eq(x => x.title, "悲伤逆流成河");
            var book = bookDao.Find(filter).FirstOrDefault();
            Console.WriteLine("更新前:{0}", book.ToString());
            var update = Builders<book>.Update.Set(x => x.publisher, "新时代出版社")
                                              .Set(x => x.price, 35)
                                              .Inc(x => x.saleCount, 10);
            var result = bookDao.UpdateOne(filter, update);
            Console.WriteLine("IsAcknowledged:{0} MatchedCount:{1} UpsertedId:{2} IsModifiedCountAvailable:{3} ModifiedCount:{4}",
                result.IsAcknowledged, result.MatchedCount, result.UpsertedId, result.IsModifiedCountAvailable, result.ModifiedCount);
            book = bookDao.Find(filter).FirstOrDefault();
            Console.WriteLine("更新后:{0}", book.ToString());
        }

        public static void Delete()
        {
            var result = bookDao.DeleteOne(x => x.title == "悲伤逆流成河");
            Console.WriteLine("DeletedCount:{0} IsAcknowledged:{1} ", result.DeletedCount, result.IsAcknowledged);
        }

        public static void Insert()
        {
            var bookInfo = new book
            {
                Id = new MongoDB.Bson.ObjectId(),
                author = "郭敬明",
                price = 10.00,
                publisher = "春风文艺出版社",
                saleCount = 0,
                title = "悲伤逆流成河"
            };
            bookDao.InsertOne(bookInfo);
        }
    }
}

因为我对book类的ToString方法,所以输出结果如下

上面都是用的数据库和实体字段名一致的情况,如果不一致怎么办呢,Xml和Json等序列化都有标签特性可以用别名,Bson肯定也会有,新建BookInfo实体如下

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

namespace MongoTest
{
    public class BookInfo : DefaultIdEntity
    {
        public string Title { get; set; }
        public double Price { get; set; }
        public string Author { get; set; }
        public string Publisher { get; set; }
        public int SaleCount { get; set; }
    }
}

将上面执行操作的book全部替换成BookInfo试试,发现没报错,再去数据库看看会发现,数据库新增了一个文档,我们预期得结果是要操作在book上,显然这不是我们想要得

现在将调用Collection调用改为指定collectionName为book的形式

        static IMongoCollection<BookInfo> bookDao;
        static OperatDb()
        {
            bookDao = new DbContext().Collection<BookInfo>("book");
        }

再次运行程序,发现报错了,文档节点和实体字段不匹配

现在给BookInfo得字段都加上Bson的标签特性

using MongoDB.Bson.Serialization.Attributes;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace MongoTest
{
    public class BookInfo : DefaultIdEntity
    {
        [BsonElement("title")]
        public string Title { get; set; }
        [BsonElement("price")]
        public double Price { get; set; }
        [BsonElement("author")]
        public string Author { get; set; }
        [BsonElement("publisher")]
        public string Publisher { get; set; }
        [BsonElement("saleCount")]
        public int SaleCount { get; set; }
    }
}

现在一切正常了,显示结果和之前得一样就不再贴图了,有子文档得数据操作与此类似,譬如有如下数据

构建实体如下

  public class Director : Entity
    {
        [BsonElement("name")]
        public string Name { get; set; }
        [BsonElement("country")]
        public string Country { get; set; }
        [BsonElement("age")]
        public int Age { get; set; }
        [BsonElement("movies")]
        public List<Movie> Movies { get; set; }
    }
    public class Movie
    {
        [BsonElement("name")]
        public string Name { get; set; }
        [BsonElement("year")]
        public int Year { get; set; }
    }

时间: 2024-10-13 01:42:14

MongoDB.Driver 2.4以上版本 在.NET中的基本操作的相关文章

在.net下打造mongoDb基于官方驱动最新版本

还是一如既往先把结构图放出来,上上个版本添加了redis的缓存,但是不满足我的需求,因为公司有项目要求是分布式所以呢,这里我就增加了mongoDb进行缓存分布式,好了先看结构图. 总的来说比较蛋疼,因为从来没有使用过mongoDB,从安装,到转为windows服务,设置权限等等,好吧这都是题外话. 在写这个MongoDB版本的时候遇到的一些问题,我先总结下: 1.MongoDb版本是官网最新版3.4.4,官方驱动为2.4.3,首先我的项目是以GUID做为主键,在往MongonDB中插入时遇到的是

MongoDB 3.0 关于安全认证后使用C#调用碰上“System.TimeoutException”类型的异常在 MongoDB.Driver.Core.dll 中发生的相关问题

"System.TimeoutException"类型的异常在 MongoDB.Driver.Core.dll 中发生,但未在用户代码中进行处理 操作MongoDB类库版本: ---------------------------------------------- MongoDB.Driver 2.3 MongoDB.Driver.Core 2.3 MongoDB.Bson 2.3 MongoDB 版本 3.0 连接字符串的相关变化: -----------------------

Ruby2.3.3操作MongoDB入门(Mongo驱动版本2.4.3)-先期准备&数据库连接创建

最近在学习MongoDB的相应知识,涉及到使用Ruby操作MongoDB数据库,因为参考数据中使用的Ruby Mongo驱动版本不是2.3.3,所以在操作方面会有所不同,因此撰写了这篇Ruby2.3.3操作MongoDB入门,学习方式是参考网址https://docs.mongodb.com/ruby-driver/v2.3/quick-start/ 快速学习主要分为以下几个部分: 先期准备 1.1 本地启动MongoDB数据库,端口号27017 Windows环境下启动方式如下:首先CMD命令

基于CentOS7搭建mongodb(3.6.6版本)

基于CentOS7搭建mongodb(3.6.6版本) mongodb简介 Mongodb,分布式文档存储数据库,由C++语言编写,旨在为WEB应用提供可扩展的高性能数据存储解决方案.MongoDB是一个高性能,开源,无模式的文档型数据库,是当前NoSql数据库中比较热门的一种.它在许多场景下可用于替代传统的关系型数据库或键/值存储方式.Mongo使用C++开发.MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的.他支持的数据结构非常松散,

Mongodb.Driver操作MongoDB

上一篇博客主要介绍了MongoDB和它的的使用场景,这篇文章主要介绍一下如何用C#如何借助官方的Mongodb.Driver操作MongoDB 1.NuGet引入Mongodb.Dirver 安装后项目中会新增如下dll MongoDB.Driver.dll:顾名思义,驱动程序 MongoDB.Bson.dll:序列化.Json相关 2.初始化集合,子类需重写集合名 #region 构造函数 /// <summary> /// 集合 /// </summary> public st

基于MongoDB.Driver的扩展

由于MongoDB.Driver中的Find方法也支持表达式写法,结合[通用查询设计思想]这篇文章中的查询思想,个人基于MongoDB扩展了一些常用的方法. 首先我们从常用的查询开始,由于MongoDB.Driver支持类似于AutoMapper返回的指定属性(Project<TDto>方法),所以这里都是基于泛型的扩展 /// <summary> /// 同步查询指定条件的数据,并且返回指定类型TDto /// </summary> /// <typeparam

扩展 MongoDB.Driver 支持实体使用方式

一.安装 Install-Package Apteryx.MongoDB.Driver.Extend 移步我的项目https://github.com/code-institutes/Apteryx.MongoDB.Driver.Extend有详细的使用说明. 原文地址:https://www.cnblogs.com/apteryx/p/10818941.html

解决最近windows版本Node.js中npm出现的“Error: ENOENT, stat &#39;C:\Users\UserName\AppData\Roaming\npm”的问题

(转载请注明出处,from www.cnblogs.com/xdxer) 问题可能如下所示 解决方案: 在 'C:\Users\UserName\AppData\Roaming\‘ 下手动的增加一个文件夹npm . 然后问题就解决了. 解决最近windows版本Node.js中npm出现的"Error: ENOENT, stat 'C:\Users\UserName\AppData\Roaming\npm"的问题

在Oracle电子商务套件版本12.2中创建自定义应用程序(文档ID 1577707.1)

在本文档中 本笔记介绍了在Oracle电子商务套件版本12.2中创建自定义应用程序所需的基本步骤.如果您要创建新表单,报告等,则需要自定义应用程序.它们允许您将自定义编写的文件与Oracle电子商务套件提供的标准种子功能分离.在向您的环境应用修补程序或执行升级时可以保留自定义设置. 自定义数据和索引表空间默认为APPS_TS_TX_DATA和APPS_TS_TX_IDX. 注意:当没有活动的修补程序周期时,应在运行文件系统上执行本文档中描述的过程. 也可以按照此过程更正先前创建的不使用AD Sp