MongoDB.Driver 2.4以上版本 在.NET中的基本操作
分类:
IT文章
•
2024-02-01 11:03:48
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>
{
}
}
View Code
开始构建数据库访问类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:123456@192.168.20.54: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);
}
}
}
View Code
现有数据库数据 文档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; }
}
}
View Code
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);
}
}
}