C#中的MongoDB

C#中的MongoDB

MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。

MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。

关系型数据库(RDBMS)遵循ACID规则(事务).

  • A(Atomicity)原子性

  • C(Consistency)一致性

  • I(Isolation)独立性

  • D(Durability)持久性

分布式计算系统-CAP定理

在计算机科学中, CAP定理(CAP theorem), 指出对于一个分布式计算系统来说,不可能同时满足以下三点:

  • 一致性(Consistency) (所有节点在同一时间具有相同的数据)

  • 可用性(Availability) (保证每个请求不管成功或者失败都有响应)

  • 分区容错性(Partition tolerance) (系统中任意信息的丢失或失败不会影响系统的继续运作)

CAP理论的核心是:一个分布式系统不可能同时很好的满足一致性,可用性和分区容错性这三个需求,最多只能同时较好的满足两个。

因此,根据 CAP 原理将 NoSQL 数据库分成了满足 CA 原则、满足 CP 原则和满足 AP 原则三大类:

  • CA - 单点集群,满足一致性,可用性的系统,通常在可扩展性上不太强大。

  • CP - 满足一致性,分区容忍性的系统,通常性能不是特别高。

  • AP - 满足可用性,分区容忍性的系统,通常可能对一致性要求低一些。

Docker安装MongoDB

# Run MongoDB镜像docker run -itd --name mongo -p 27017:27017 mongo --auth
# 设置密码$ docker exec -it mongo mongo admin# 创建一个名为 admin,密码为 123456 的用户。>  db.createUser({ user:'admin',pwd:'123456',roles:[ { role:'userAdminAnyDatabase', db: 'admin'},"readWriteAnyDatabase"]});# 尝试使用上面创建的用户信息进行连接。> db.auth('admin', '123456')

C# 操作MongoDB

# 安装依赖dotnet add package MongoDB.Driver --version 2.19.0
using System;using System.Collections.Generic;using System.Threading.Tasks;using MongoDB.Bson;using MongoDB.Driver;
namespace MongoDBDemo{    class Program    {        static void Main(string[] args)        {            string connectionString = "mongodb://127.0.0.1:27017";            MongoClient mongoClient = new MongoClient(connectionString);
            MongoCredential credential;            credential = MongoCredential.CreateCredential("sampleUser", "myDb", "password");            Console.WriteLine("Connected to the database successfully!");
            IMongoDatabase database = mongoClient.GetDatabase("myDB");
            const string collectionName = "tutorial3";            var collection = database.GetCollection<BsonDocument>(collectionName);            Console.WriteLine("Select collection successfully!");
            BsonDocument document1 = new BsonDocument("title", "MongoDB")                .Add("description", "database")                .Add("likes", 100)                .Add("url", "www.Test.net")                .Add("by", "Test");            BsonDocument document2 = new BsonDocument("title", "html")                .Add("description", "database")                .Add("likes", 200)                .Add("url", "www.Test.net/html")                .Add("by", "Test");            List<BsonDocument> list = new List<BsonDocument>();            list.Add(document1);            list.Add(document2);            collection.InsertMany(list);
            var filter = new BsonDocument();            var list2 = Task.Run(async () => await collection.Find(filter).ToListAsync()).Result;            list2.ForEach(p =>            {                Console.WriteLine(p);            });            Console.ReadKey();        }    }}

另外,一般情况下,会在对MongoDB的基础操作上,进行二次封装为MongodbHelper,以供业务逻辑的调用。