C#中的MongoDB

240 阅读3分钟

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,以供业务逻辑的调用。

参考

  1. MongoDB 教程
  2. Docker 安装 MongoDB
  3. C#操作MongoDB
  4. MongodbHelper