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

MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。

什么场景下使用MongoDB

MongoDB虽然是NoSQL(非关系型的数据库),但是实际使用的时候可以当做关系型数据库来用,

mysql等数据库中单表数据量大了之后,想要扩展字段就非常痛苦,应为要卡很长时间,这时候就必须面临着两种选择 要么水平切分数据库,要么使用nosql来存储海量数据,mongodb作为日志存储是非常利于扩展的,还有数据分析等都可以用mongodb作为灵活的数据源的存储方式。

MongoDB 概念解析

在mongodb中基本的概念是文档、集合、数据库,下面我们挨个介绍。

SQL术语/概念 MongoDB术语/概念 解释/说明
database database 数据库
table collection 数据库表/集合
row document 数据记录行/文档
column field 数据字段/域
index index 索引
table joins 表连接,MongoDB不支持
primary key primary key 主键,MongoDB自动将_id字段设置为主键

数据库

一个mongodb中可以建立多个数据库。

MongoDB的默认数据库为"db",该数据库存储在data目录中。

MongoDB的单个实例可以容纳多个独立的数据库,每一个都有自己的集合和权限,不同的数据库也放置在不同的文件中。

"show dbs" 命令可以显示所有数据的列表。

集合

集合就是 MongoDB 文档组,类似于 RDBMS (关系数据库管理系统:Relational Database Management System)中的表格。

集合存在于数据库中,集合没有固定的结构,这意味着你在对集合可以插入不同格式和类型的数据,但通常情况下我们插入集合的数据都会有一定的关联性。

比如,我们可以将以下不同数据结构的文档插入到集合中:

{"site":"www.baidu.com"}

{"site":"www.google.com","name":"Google"}

{"site":"www.runoob.com","name":"菜鸟教程","num":5}

当第一个文档插入时,集合就会被创建。

合法的集合名

集合名不能是空字符串""。

集合名不能含有\0字符(空字符),这个字符表示集合名的结尾。

集合名不能以"system."开头,这是为系统集合保留的前缀。

用户创建的集合名字不能含有保留字符。有些驱动程序的确支持在集合名里面包含,这是因为某些系统生成的集合中包含该字符。除非你要访问这种系统创建的集合,否则千万不要在名字里出现$。 

文档(Document)

文档是一组键值(key-value)对(即 BSON)。MongoDB 的文档不需要设置相同的字段,并且相同的字段不需要相同的数据类型,这与关系型数据库有很大的区别,也是 MongoDB 非常突出的特点。

下表列出了 RDBMS 与 MongoDB 对应的术语:

RDBMS MongoDB
数据库 数据库
表格 集合
文档
字段
表联合 嵌入文档
主键 主键 (MongoDB 提供了 key 为 _id )

需要注意的是:

文档中的键/值对是有序的。

文档中的值不仅可以是在双引号里面的字符串,还可以是其他几种数据类型(甚至可以是整个嵌入的文档)。

MongoDB区分类型和大小写。

MongoDB的文档不能有重复的键。

文档的键是字符串。除了少数例外情况,键可以使用任意UTF-8字符。

文档键命名规范:

键不能含有\0 (空字符)。这个字符用来表示键的结尾。

.和$有特别的意义,只有在特定环境下才能使用。

以下划线"_"开头的键是保留的(不是严格要求的)。

MongoDB 数据类型

下表为MongoDB中常用的几种数据类型。

数据类型 描述
String 字符串。存储数据常用的数据类型。在 MongoDB 中,UTF-8 编码的字符串才是合法的。
Integer 整型数值。用于存储数值。根据你所采用的服务器,可分为 32 位或 64 位。
Boolean 布尔值。用于存储布尔值(真/假)。
Double 双精度浮点值。用于存储浮点值。
Min/Max keys 将一个值与 BSON(二进制的 JSON)元素的最低值和最高值相对比。
Array 用于将数组或列表或多个值存储为一个键。
Timestamp 时间戳。记录文档修改或添加的具体时间。
Object 用于内嵌文档。
Null 用于创建空值。
Symbol 符号。该数据类型基本上等同于字符串类型,但不同的是,它一般用于采用特殊符号类型的语言。
Date 日期时间。用 UNIX 时间格式来存储当前日期或时间。你可以指定自己的日期时间:创建 Date 对象,传入年月日信息。
Object ID 对象 ID。用于创建文档的 ID。
Binary Data 二进制数据。用于存储二进制数据。
Code 代码类型。用于在文档中存储 JavaScript 代码。
Regular expression 正则表达式类型。用于存储正则表达式。

ObjectId

ObjectId 类似唯一主键,可以很快的去生成和排序,包含 12 bytes,含义是:

  • 前 4 个字节表示创建 unix 时间戳,格林尼治时间 UTC 时间,比北京时间晚了 8 个小时
  • 接下来的 3 个字节是机器标识码
  • 紧接的两个字节由进程 id 组成 PID
  • 最后三个字节是随机数

MongoDB 中存储的文档必须有一个 _id 键。这个键的值可以是任何类型的,默认是个 ObjectId 对象

mongodb windows安装

下载地址 https://www.mongodb.com/download-center/community

客户端工具

使用以下三种都可以

https://robomongo.org/download【推荐】

https://www.mongodb.com/download-center/compass【官方的,windows下会默认安装】

https://nosqlbooster.com/downloads

如何使用

引入 nuget包 MongoDB.Driver

客户端:

以下是常用的CRUD测试用例

using Microsoft.VisualStudio.TestTools.UnitTesting;
using MongoDB.Bson;
using MongoDB.Bson.Serialization.Attributes;
using MongoDB.Driver;
using MongoDB.Driver.Linq;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq; namespace MongoDBDemo
{
/// <summary>
/// mongodb先创建库 test
/// 再创建表 testlist
/// </summary>
[TestClass]
public class UnitTest1
{
private MongoClient client;
private IMongoDatabase database; public UnitTest1()
{
this.client = new MongoClient(new MongoClientSettings { Server = new MongoServerAddress("127.0.0.1", 27017), });
this.database = client.GetDatabase("test");
} /// <summary>
/// 查所有记录
/// </summary>
[TestMethod]
public void TestQueryAll()
{
var list = database.GetCollection<A>("testlist");
var result = list.Find("{}").ToList();
} /// <summary>
/// 基础的查询方式
/// </summary>
[TestMethod]
public void TestQueryBase()
{
var collection = database.GetCollection<BsonDocument>("testlist");
BsonDocument filter = new BsonDocument(); var s = collection.Find(filter).ToList(); using (var cursor = collection.FindAsync(filter).Result)
{
while (cursor.MoveNextAsync().Result)
{
var batch = cursor.Current;
foreach (BsonDocument document in batch)
{
Console.WriteLine(document.ToJson());
}
}
}
} /// <summary>
/// 组装查询语句方式
/// </summary>
[TestMethod]
public void TestQueryBuilders()
{
var list = database.GetCollection<A>("testlist");
var filter = Builders<A>.Filter.Eq(x => x.Name, "b");
var result = list.Find(filter).ToList();
} /// <summary>
/// linq asqueryable方式
/// </summary>
[TestMethod]
public void TestQueryLinq()
{
var list = database.GetCollection<A>("testlist");
var result = list.AsQueryable().Where(p => p.Name == "b").ToList();
} [TestMethod]
public void TestQueryLinq2()
{
var list = database.GetCollection<A>("testlist");
var result = list.Find(p => p.Name == "b").ToList();
} [TestMethod]
public void TestInsert()
{
var list = database.GetCollection<A>("testlist");
list.InsertOne(new A { Name = "a", Count = 1 });
} [TestMethod]
public void TestUpdate()
{
var list = database.GetCollection<A>("testlist");
var update = Builders<A>.Update;
list.UpdateOne(p => p.Name == "a", update.Set("Count", 2));
} [TestMethod]
public void TestDelete()
{
var list = database.GetCollection<A>("testlist");
list.DeleteOne(p => p.Name == "s");
}
} //如果不加这个[BsonIgnoreExtraElements]会报错
// System.FormatException:“Element '_id' does not match any field or property of class,
// 也可以加属性 public ObjectId _id { get; set; } 来解决
[BsonIgnoreExtraElements]
public class A
{
//public ObjectId _id { get; set; }
public string Name { get; set; } public int Count { get; set; }
}
}

更详细的关于CRUD操作可以看官方文档

MongoDB入门及 c# .netcore客户端MongoDB.Driver使用的更多相关文章

  1. Mongodb入门并使用java操作Mongodb

    转载请注意出处:http://blog.csdn.net/zcm101 最近在学习NoSql,先从Mongodb入手,把最近学习的总结下. Mongodb下载安装 Mongodb的下载安装就不详细说了 ...

  2. MongoDb 入门教程

    MongoDb 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的. 它是可扩展的高性能数据存储解决方案,经常被用于非关系型数据的存储,能存储海量的数据. 常 ...

  3. MongoDB入门实践

    MongoDB入门实践 简单介绍MongoDB,包括MongoDB的使用场景.和MySQL的对比.安装部署.Java客户端访问及总结 MongoDB? 我们遵循需求驱动技术的原则,通过一个场景来引入M ...

  4. MongoDB入门简介

    MongoDB入门简介 http://blog.csdn.net/lolinzhang/article/details/4353699 有关于MongoDB的资料现在较少,且大多为英文网站,以上内容大 ...

  5. MongoDB入门系列(一):基础概念和安装

    概述 MongoDB是目前非常流行的一种非关系型数据库,作为入门系列的第一篇本篇文章主要介绍Mongdb的基础概念知识包括命名规则.数据类型.功能以及安装等. 环境: OS:Windows Versi ...

  6. 基于netcore实现mongodb和ElasticSearch之间的数据实时同步的工具(Mongo2Es)

    基于netcore实现mongodb和ElasticSearch之间的数据实时同步的工具 支持一对一,一对多,多对一和多对多的数据传输方式. 一对一 - 一个mongodb的collection对应一 ...

  7. .NET平台下使用MongoDB入门教程

    适合人群:完全没有接触MongoDB或对MongoDB有一点了解的C#开发人员.因为本文是一篇入门级的文章. 一.了解MongoDB  MongoDB是一个基于分布式文件存储的数据库.由C++语言编写 ...

  8. MongoDB 入门

    1 MongoDb 简介 MongoDB是为互联网而生的数据库,是文档数据库. 1.1 优点: Schema-less,不需要预先定义表结构,同一个"表"中可以保存多个格式的数据: ...

  9. MongoDB入门必读(概念与实战并重)

    MongoDB入门必读(概念与实战并重) 一.概述 MongoDB是一个基于分布式文件存储的数据库开源项目.由C++语言编写.旨在为WEB应用提供可护展的高性能数据存储解决方案. MongoDB是一个 ...

随机推荐

  1. pythonday04数据类型(二)

    今日内容: 1.列表 2.元组 3.py2与py3的区别 4解释器/编译器 5.练习题 1.列表 想要表示多个”事物“,可以使用列表 users = ["李邵奇","奇航 ...

  2. Zookeeper_阅读源码第一步_在 IDE 里启动 zkServer(单机版)

    Zookeeper是开源的,如果想多了解Zookeeper或看它的源码,最好是能找到它的源码并在 IDE 里启动,可以debug看它咋执行的,能够帮助你理解其原理. 准备源码 所以我们很容易搞到它的源 ...

  3. 对平底锅和垃圾的O奖论文的整理和学习[1](2018-02-08发布于知乎)

    今天和杉杉同志在Pacific Coffee坐了0.4天,目前两人都处于放空状态. 这种天气有暖气真的太棒了. 我今天看的论文是这两篇: MCM2013B题O奖论文MCM2016B题O奖论文 先说第一 ...

  4. 7.17 正则表达式 re模块

    在介绍正则表达式和re模块之前,先简要介绍一下 正则表达式与re模块的关系 1.正则表达式是一门独立的技术,任何语言均可使用 2.python中要想使用正则表达式需要通过re模块 正则表达式 元字符 ...

  5. SQL TRUNCATE TABLE 命令

    SQL TRUNCATE TABLE 命令 SQL TRUNCATE TABLE 命令用于删除现有数据表中的所有数据. 你也可以使用 DROP TABLE 命令来删除整个数据表,不过 DROP TAB ...

  6. nginx对特定参数限流

    接到一个需求, 需要对请求(GET)里面的某个参数  的特定的值, 进行限流; 因为不限流的话, 不知道什么时候这个id的请求飙一下, 服务端就被压死了... 就像这样: /index.html?id ...

  7. Android进阶之绘制-自定义View完全掌握(一)

    Android的UI设计可以说是决定一个app质量的关键因素,因为人们在使用app的时候,最先映入眼帘的就是app的界面了,一个美观.充实的界面能够给用户带来非常好的体验,会在用户心中留下好的印象. ...

  8. 使用maven搭建ssm框架环境

    1.前言 因为经常换环境,在搭ssm框架的时候老是出错,所以记录一下最近搭建的环境,以供参考. 本文讲解如何使用maven搭建ssm框架,并能用于简单的登录注册. IDE:IDEA,JDK版本:1.8 ...

  9. HBase的安装和使用

    文章作者:foochane  原文链接:https://foochane.cn/article/2019062801.html 1 Hbase基本介绍 Hbase是一个分布式数据库,可以提供数据的实时 ...

  10. React项目升级遇到的问题复盘(2019-09-02)

    老铁们,发没发现我换了个贼帅的头像,高端大气上档次,非洲大地我最凶!可把我自己牛逼坏了. 不扯啦不扯啦,抓紧进入今天的正题,从今天开始我会每天写一下每天工作的出现的问题,主要对这些问题出现的原因,以及 ...