MongoDB数据库介绍并用.NET Core对其进行编码

浅入 MongoDB

MonogoDB 是什么

MongoDB 是 NoSQL 型数据库,主要特征是存储结构化数据,MongoDB 是基于分布式文件存储的开源数据库系统。

结构化数据

以往我们使用 Mysql、SqlServer 等数据库,数据都是一条条的。MongoDB 的结构化数据正是区别于这种列-行式的数据。

结构化数据具有层级关系:

例如:

{
     name: "MongoDB",
     type: "database",
     count: 1,
     info: {
         x: 203,
         y: 102
     }
}

MongoDB 与关系型数据库

由于 MongoDB 中,没有表、行、列,因此初学 MongoDB 时可能会有困扰,这里给出一些 MongoDB 与 普通SQL数据库对应的术语。

SQL术语/概念 MongoDB术语/概念 解释/说明
database database 数据库
table collection 数据库表/集合
row document 数据记录行/文档
column field 数据字段/域
index index 索引
table joins   非关系型数据库,表与表之间没关系
primary key primary key 主键,MongoDB自动将_id字段设置为主键

资料来源:https://www.runoob.com/mongodb/mongodb-databases-documents-collections.html

MongoDB 入门命令

使用 mongo 进入 MongoDB shell 后,可使用命令(相当于SQL)执行操作。

注: MongoDB 中,有一个自动的 _id 字段,此字段 MongoDB 自动设置为主键并自动生成值。

显示所有数据库(包含系统数据库):

show dbs

当前正在操作的数据库或集合:

db

连接到指定数据库:

use {数据库名称}

显示所有集合:

show collections
# 或
show tables

查看集合中的所有文档:

# MyCollection 是集合名称
db.getCollection("MyCollection").find()
db.getCollection("MyCollection").find().limit(1000).skip(0)

可能你不信,笔者百度了很久,第一页没找到一篇合适的友好的 "mongoDB 查看集合中的所有文档",特别是 CSDN 的垃圾文真的多。建议别瞎折腾了,去下一个 Navicat Premium,操作的时候,底部会提示所用的命令。

另外 MongoDB 有很多实用工具:https://docs.mongodb.com/tools/

文档

MongoDB 中的文档(Document)即关系型数据库中的一条记录(row)、一行数据。

但, MongoDB 中,一个集合(Collection-Table)中,是不需要具有相同字段的。例如:

A 文档:

{
     name: "MongoDB",
     type: "database",
     count: 1,
     info: {
         x: 203,
         y: 102
     }
}

B 文档:

{
     name: "MongoDB",
     typeName: "database",
     dataCount: 1,
     dataInfo: {
         m: 203,
         n: 102
     }
}

.NET Core 示例

我们从一个基础模板开始。

创建一个控制台程序,打开 Nuget 搜索并安装 MongoDB.Driver

            var client = new MongoClient("mongodb://{MongoDB}:27017");
            IMongoDatabase database = client.GetDatabase("Test");

集合

可以通过 CreateCollection() 或 CreateCollectionAsync() 创建一个集合,跟普通数据库不同的是,创建集合时是不需要指定结构的,只需要指定名称即可:

await database.CreateCollectionAsync("Test");

获取集合

GetCollection() 函数可以让我们获取到集合,如果集合不存在,则会自动创建。

IMongoCollection<TDocument> GetCollection<TDocument>()

由于同一个集合可以有不同字段和字段类型的文档,因此几个文档如果有所差别,是很难统一起来的,例如:

(N/A) 代表此文档没有这个字段;如果一个文档有 10 个字段,另一个文档有 8 个字段,但是两者的字段完全不同时,要合并起来来,就有 18 个字段了。很明显,不应该汇集在一起,而是应该使用强类型对其 ”归档“ 。

创建两个类,分别为 Test1,Test2,其内容如下:

    public class Test1
    {
        public string Name { get; set; }
    }

    public class Test2
    {
        public string DataType { get; set; }
    }

以两种文档类型获取集合:

            var collection1 = database.GetCollection<Test1>("Test");
            var collection2 = database.GetCollection<Test2>("Test");

这个获取集合的意思是,获取此集合中这类格式的文档的操作能力。

往集合中插入数据:

            collection1.InsertOne(new Test1 { Name = "Test1" });
            collection2.InsertOne(new Test2 { DataType = "Test2" });
			// await collection.InsertOneAsync(object);

启动,查看结果。

InsertMany() 可以插入批量数据:

            Test1[] datas = new Test1[]
            {
                new Test1 { Name = "Test1" }
            };
            collection1.InsertMany(datas);

统计数量

获取集合中所有的文档数:

collection1.CountDocuments(new BsonDocument())
// await collection1.CountDocumentsAsync(new BsonDocument());

任意一个文档集合对象,使用 CountDocuments(new BsonDocument()) 都是获得此集合的所有文档数,而不是此类型的文档数。例如:

            var collection1 = database.GetCollection<Test1>("Test");
            collection1.CountDocuments(new BsonDocument())

获取的并不是 Test1 类型的文档数量,而是整个集合所有文档的数量。

原因是,CountDocuments() 是一个过滤器函数,可以使用指定条件来筛选符合条件的文档的数量。指定条件后面会介绍。

查询

MongoDB 的查询并不像 LInq 中的表达式,基础了 IEnumerable或 IEnumerable<T> 接口,因此驱动没有 WhereSelect 这种表达式的查询方法。

Find() 函数是查询函数,里面可以添加丰富的表达式,来筛选文档,当数据加载到本地内存后,即可使用丰富的表达式。

BsonDocument 是一个类型,代表了要查询的文档筛选条件,如果 BsonDocument 对象没有添加任何属性,则代码没有筛选参数,则默认所有文档都符号条件。

我们把 Test1 和 Test2 类型,都加上一个属性:

        public ObjectId _id { get; set; }

不然会报格式化错误:System.FormatException

如何序列化文档

document 是文档对象, JsonSerializer 是 System.Text.Json 的静态类。

Console.WriteLine(JsonSerializer.Serialize(document));

查询第一条记录

var document = collection1.Find(new BsonDocument()).FirstOrDefault();

不加条件可能导致的问题

以下代码会导致程序报错:

            var documents = await collection1.Find(new BsonDocument()).ToListAsync();
            foreach(var item in documents)
            {
                Console.WriteLine(JsonSerializer.Serialize(item));
            }

因为 collection1 是标记为 Test1 的文档集合;但是 .Find(new BsonDocument()) 是查询集合中的所有文档,因此获取到 Test2。

但是 Test2 是不能转为 Test1 的,因此,会导致程序报错。

查看所有文档

var documents = collection1.Find(new BsonDocument()).ToList();
var documents = await collection1.Find(new BsonDocument()).ToListAsync();

前面已经说过,如果集合中存在其它格式的文档,获取全部文档时,因为 Test2 跟 Test1 没任何关系,会导致 MongoDB.Driver 报错。

如果文档数量比较大,要使用异步的 ForEachAsync() 查询,其原理是 回调。

            List<Test1> tests = new List<Test1>();
            Action<Test1> action = item =>
            {
                tests.Add(item);
                Console.WriteLine(JsonSerializer.Serialize(item));
            };

            await collection1.Find(new BsonDocument()).ForEachAsync(action);

查询结束

使用 Find() 以及后续函数查询后,要结束查询(延迟加载),可以使用 ToCursor() 函数结束,程序会立即开始查询并将数据返回内存。

转换查询

使用 ToEnumerable() 可以使用 Linq 来查询文档。

var list = collection1.Find(new BsonDocument()).ToCursor().ToEnumerable();

过滤器

前面我们查询的时候都使用 .Find(new BsonDocument())BsonDocument 是过滤器对象,里面存储了过滤的规则,但是我们不能直接设置 new BsonDocument()中的属性,而是使用构建器FilterDefinitionBuilder对象,而此对象可以通过 MongoDB.Driver.Builders<TDocument>.Filter 创建 。

假设有以下数据集(文档):

5f8bdf88e63d14cb5f01dd85	小明	19
5f8bdf88e63d14cb5f01dd86	小红	20
5f8bdf88e63d14cb5f01dd87	小张	16
5f8bdf88e63d14cb5f01dd88	小小	17

# -----插入数据的代码-----
    public class Test
    {
        public ObjectId _id { get; set; }
        public string Name { get; set; }
        public int Age { get; set; }
    }

            var datas = new Test[]
            {
                new Test{ Name="小明",Age=19},
                new Test{ Name="小红",Age=20},
                new Test{ Name="小张",Age=16},
                new Test{ Name="小小",Age=17}
            };

            collection.InsertMany(datas);

使用构建器:

FilterDefinition<Test> filter = Builders<Test>.Filter

查询 Age 大于 18 的文档:

FilterDefinition<Test> filter = filterBuilder.Where(item => item.Age >= 18);

获取结果:

Test[] documents = collection.Find(filter).ToEnumerable<Test>().ToArray();

过滤器还有 Gt()In()Lte() 等非 Linq 的函数,需要查看文档学习。

Builders<TDocument>

Builders<TDocument> 除了能够生成过滤构建器,还有其它几种构建器:

		// 条件过滤
        public static FilterDefinitionBuilder<TDocument> Filter { get; }

		// 索引过滤
        public static IndexKeysDefinitionBuilder<TDocument> IndexKeys { get; }

		// 映射器,相当于使用 Linq 的 .Select() 查询自己只需要的字段
        public static ProjectionDefinitionBuilder<TDocument> Projection { get; }

		// 排序,创建排序规则,如工具年龄排序
        public static SortDefinitionBuilder<TDocument> Sort { get; }

		// 更新,更新某些字段的值等
        public static UpdateDefinitionBuilder<TDocument> Update { get; }

详细请参考 https://mongodb.github.io/mongo-csharp-driver/2.10/reference/driver/definitions/#projections

名称映射

由于 MongoDB 区分字段的大小写,文档的字段一般使用驼峰命名法,首字母小写,而 C# 字段属性首字母是 大小开头的,因此需要不同名称对应起来。

可以使用 BsonElement 特性来设置映射的名称。

class Person
{
    [BsonElement("fn")]
    public string FirstName { get; set; }

    [BsonElement("ln")]
    public string LastName { get; set; }
}

以上就是 MongoDB 的初入门知识,但是使用了 MongoDB 有什么好处?可以参考这篇文章:https://www.jb51.net/article/238542.htm

整理场景如下:

  • 存储应用程序日志。日志结构化,查找方便,可以导出其它格式和二次利用。
  • 增加字段不需要改动表结构,灵活变更。
  • 支持 json 格式导入;类似 json 的数据结构;能够很容易还原对象的属性,一次性存储数据;如果使用传统数据库,则需要建立多个表并设置主键外界关系。
  • 集群。分布式集群海量数据,容易拓展;故障转移保证服务可用;
  • 解决分布式文件存储需求。
  • 索引方式灵活。

到此这篇关于MongoDB数据库介绍并用.NET Core对其进行编码的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • .Net Core如何对MongoDB执行多条件查询

    以前项目基本上全部使用MySQL数据库, 最近项目排期空出了一点时间leader决定把日志模块迁移到插入/查询性能更好的MongoDB上. 多条件查询的写法着实费了些功夫, 撰文记录一下. 一.准备工作 1. 安装过程, 不赘述了 2. 添加ReferencePackage dotnet add package mongodb.bson dotnet add package mongodb.driver 3. appsetting.json添加连接配置 "MongodbHost": {

  • asp.net core集成MongoDB的完整步骤

    一.前言及MongoDB的介绍 最近在整合自己的框架,顺便把MongoDBD的最简单CRUD重构一下作为组件化集成到asp.net core项目中,当然此篇文章中没有讲解mongodb的集群部署,等有机会分享一下. 首先,我们在MongoDB的官方文档中看到,MongoDb的2.4以上的For .Net的驱动是支持.Net Core 2.0的. 针对MongoDB,我想大家应该不陌生,没有用过也有听过. 1.mongodb是什么? MongoDB是一个基于分布式文件存储的数据库,为web应用提供

  • .Net Core使用MongoDB的详细教程

    前言 MongoDB 是由C++语言编写的,是一个基于分布式且面向文档存储的开源数据库系统. 下载地址: https://www.mongodb.com/download-center/community 在.Net Core中使用需要引入核心包 MongoDB.Driver 添加数据: //与Mongodb建立连接 MongoClient client = new MongoClient("mongodb://127.0.0.1"); //获得数据库,没有则自动创建 IMongoDa

  • .Net Core中使用MongoDB搭建集群与项目实战

    目录 安装MongoDB apt直接安装(方法1) apt仓库安装(方法2) 方法1.2启动MongoDB 通过二进制包安装(方法3) 安装依赖 deb安装MongoDB tgz安装MongoDB 启动MongoDB 卸载方法 apt卸载方法 tgz卸载方法 指定启动的配置 通过配置文件 通过参数 MongoDB绑定IP.端口 测试远程IP连接 加上密码验证 设置账号密码 开启登录验证 停止MongoDB 搭建集群 副本集 故障转移 方案 设计实例名称 如何创建集群 启动两个实例(配置) 副本集

  • .net Core连接MongoDB数据库的步骤详解

    前言 前两天在学习MongoDB相关的知识,做了个小Demo,做的是省份下面有多少所学校,嗯,做的比较粗暴... 我们在MongoDB的官方文档中看到,MongoDb的2.4以上的For .Net的驱动是支持.Net Core 2.0的. 所以,在我们安装好了MangoDB后,就可以开始MangoDB的.Net之旅了. 方法如下: 连接MongoDB首先要通过Nuget添加一个MongoDB的包,下载此包 安装完毕后开始写代码了,创建一个省份实体,一个学校实体 using MongoDB.Bso

  • MongoDB数据库介绍并用.NET Core对其进行编码

    浅入 MongoDB MonogoDB 是什么 MongoDB 是 NoSQL 型数据库,主要特征是存储结构化数据,MongoDB 是基于分布式文件存储的开源数据库系统. 结构化数据 以往我们使用 Mysql.SqlServer 等数据库,数据都是一条条的.MongoDB 的结构化数据正是区别于这种列-行式的数据. 结构化数据具有层级关系: 例如: { name: "MongoDB", type: "database", count: 1, info: { x: 2

  • MongoDB数据库部署环境准备及使用介绍

    目录 一.MongoDB 简介 1.MongoDB 特点 2.MongoDB 适用场景 3.MongoDB 存储结构 4.MongoDB 数据类型 二.部署 MongoDB 数据库应用 1.准备系统环境 2.安装 MongoDB 3.创建 MongoDB 存储目录以及配置文件 4.编写服务启动脚本 一.MongoDB 简介 MongoDB 是由 C++ 语言编写的,是一个基于分布式文件存储的非关系型开源数据库系统.其优势在于可以存放海量数据,具备强大的查询功能,是一个独立的面向集合文档形式的.

  • Spring Boot中使用MongoDB数据库的方法

    MongoDB数据库简介 简介 MongoDB是一个高性能,开源,无模式的,基于分布式文件存储的文档型数据库,由C++语言编写,其名称来源取自"humongous",是一种开源的文档数据库──NoSql数据库的一种.NoSql,全称是 Not Only Sql,指的是非关系型的数据库. 特点 MongoDB数据库的特点是高性能.易部署.易使用,存储数据非常方便.主要功能特性有: * 面向集合存储,易存储对象类型的数据. * 模式自由. * 支持动态查询. * 支持完全索引,包含内部对象

  • 2021最新版windows10系统MongoDB数据库安装及配置环境

    一. MongoDB的下载与安装 1.1 下载地址 https://www.mongodb.com/download-center/community?jmp=docs 1.2 安装 创建一个 mongodb文件夹 存放下载好的 zip 二. 配置环境 鼠标右击选择计算机->属性 如下图,我们在新建中输入自己安装的MongoDB的bin文件夹路径然后选择确定即可! 输入命令就可以查看mongoDB的版本了 mongo -version 三. 配置系统服务 在MongoDB解压目录(bin文件同级

  • 在C#中使用MongoDB数据库

    一.添加MongoDB引用 想要在C#中使用MongoDB,首先安装支持MongoDB的C#版的驱动. 利用MongoDB官方发布的C#驱动,可通过网络下载或nuget安装,得到MongoDB相关的dll,添加到项目中引用. https://docs.mongodb.com/drivers/csharp/ 通过NuGet方式添加 第一步:在项目中右键,选择管理NuGet管理包 第二步:搜索MongoDB,选择MongoDB.Driver添加,我这里已经添加过了所以没有添加按钮 通过这两步,会在项

  • nodejs连接mongodb数据库实现增删改查

    准备 1.通过npm命令安装mongodb 2.安装mongodb数据库,这里不详细介绍了,安装网址:http://www.jb51.net/article/82522.htm CRUD操作 在此之前应对MongoDB数据库有所了解,知道它的一些增删查改命令. 1.增加 var MongoClient = require("mongodb").MongoClient; var DB_URL = "mongodb://localhost:27017/chm"; fun

  • 基于MongoDB数据库索引构建情况全面分析

    前面的话 本文将详细介绍MongoDB数据库索引构建情况分析 概述 创建索引可以加快索引相关的查询,但是会增加磁盘空间的消耗,降低写入性能.这时,就需要评判当前索引的构建情况是否合理.有4种方法可以使用 1.mongostat工具 2.profile集合介绍 3.日志 4.explain分析 mongostat mongostat是mongodb自带的状态检测工具,在命令行下使用.它会间隔固定时间获取mongodb的当前运行状态,并输出.如果发现数据库突然变慢或者有其他问题的话,首先就要考虑采用

  • 老生常谈MongoDB数据库基础操作

    为了保存网站的用户数据和业务数据,通常需要一个数据库.MongoDB和Node.js特别般配,因为Mongodb是基于文档的非关系型数据库,文档是按BSON(JSON的轻量化二进制格式)存储的,增删改查等管理数据库的命令和JavaScript语法很像.本文将详细介绍MongoDB数据库 数据库 数据库,顾名思义,是数据存储的仓库,主要功能有两个 1.有组织地存放数据 与在磁盘上自己存放文件不同,数据库替用户组织了数据的存储形式,用户只需要按照数据库提供的接口将数据写入,数据便会按照标准的格式被存

  • Node.js对MongoDB数据库实现模糊查询的方法

    前言 模糊查询是数据库的基本操作之一,实现对给定的字符串是否与指定的模式进行匹配.如果字符完全匹配,可以用=等号表示,如果部分匹配可认为是一种模糊查询.在关系型数据中,通过SQL使用like '%fens%'的语法.那么在mongodb中我们应该如何实现模糊查询的效果呢. 目录 mongodb模糊查询 nodejs通过mongoose的模糊查询 1. mongodb模糊查询 我们打开mongodb,以name文字字段进行测试. 精确查询 当{'name':'未来警察'}时,精确匹配到一条记录.

  • Linux下定时切割Mongodb数据库日志并删除指定天数前的日志记录

    System.out和System.err都被打印到catalina.out.catalina.out不会rotate.一般在部署Tomcat后,运行久了,catalina.out文件会越来越大,对系统的稳定造成了一定的影响. 1.可通过修改conf/logging.properties日志配置文件来屏蔽掉这部分的日志信息. [root@localhost conf]# pwd /usr/local/tomcat/conf [root@localhost conf]# cp logging.pr

随机推荐