1 MongoDb 简介

MongoDB是为互联网而生的数据库,是文档数据库。

1.1 优点:

  1. Schema-less,不需要预先定义表结构,同一个“表”中可以保存多个格式的数据;
  2. 数据支持嵌套,数据以json格式存储;
  3. 允许使用JavaScript写服务端脚本,类似于存储过程;
  4. 支持Map/Reduce;
  5. MongoDB支持地理位置索引,可以直接用于位置距离计算和查询,实现“附近的人”、

    “滴滴打车接单”等很容易;

1.2 缺点:

  1. Mongodb没有“数据一致性检查”、“事务”等,不适合存储对数据事务要求高(比如金融)的数据;只适合放非关键性数据(比如日志或者缓存)。
  2. 关联查询很弱,不适合做报表查询

2 MongoDB 下载

MongoDB 提供了可用于 32 位和 64 位系统的预编译二进制包,你可以从MongoDB官网下载安装,MongoDB 预编译二进制包下载地址:https://www.mongodb.com/download-center#community

2.1 创建数据目录

MongoDB将数据目录存储在 db 目录下。但是这个数据目录不会主动创建,我们在安装完成后需要创建它。请注意,数据目录应该放在根目录下((如: C:\ 或者 D:\ 等 )。

在本教程中,我们已经在 C 盘安装了 mongodb,现在让我们创建一个 data 的目录然后在 data 目录里创建 db 目录。

http://www.runoob.com/mongodb/mongodb-window-install.html

2.2 把MongoDB安装成windows服务的方法:

1) 创建一个配置文件mongod.cfg,在C:\Program Files\MongoDB\Server\4.0\bin下,内容是:

  1. systemLog:
  2. destination: file
  3. path:D:\Mongodb\log\mongod.log
  4. storage:
  5. dbPath: D:\Mongodb\db

把配置文件中的文件夹创建起来。

2) 注册成系统服务:

  1. mongod --config "C:\Program Files\MongoDB\Server\4.0\bin\mongod.cfg" install

3) 启动服务

2.3 windows安装方法 https://docs.mongodb.com/master/tutorial/install-mongodb-on-windows/

3 GUI客户端

Robo 3T(免费) https://robomongo.org/download

NoSQLBooster for MongoDB(收费) https://www.nosqlbooster.com/home

4 .NET操作 MongoDB

安装.Net驱动:Install-Package MongoDB.Driver

https://docs.mongodb.com/ecosystem/drivers/csharp/(.NET驱动文档)

4.1 插入

4.1.1 类插入

  1. MongoClient client = new MongoClient("mongodb://localhost");
  2. IMongoDatabase database = client.GetDatabase("TestDb1");//相当于数据库
  3. IMongoCollection<Person> collection = database.GetCollection<Person>("Persons");//大致相当于“表”
  4. Person p1 = new Person();
  5. p1.Id = 2;
  6. p1.Name = "sanwa";
  7. p1.Age = 22;
  8. collection.InsertOne(p1);//也支持异步方法,后面建议都用异步的!习惯成自然!

MongoDB里面:

(1)新插入的数据,MongoDB会自动创建“数据库”以及Collection(约等于“表”)。

(2)MongoDB默认用id做主键,因此不用显式指定id是主键。Id 对应 _id

(3)MongoDB中没有内置“自增字段”,可以把Id声明为ObjectId类型(using MongoDB.Bson)这样插入以后就自动给字段赋值。

  1. public ObjectId Id { get; set; }

再重新插入一次。

4.1.2 Json插入

  1. MongoClient client = new MongoClient("mongodb://localhost");
  2. IMongoDatabase database = client.GetDatabase("TestDb1");//相当于数据库
  3. IMongoCollection<BsonDocument> dogs = database.GetCollection<BsonDocument>("Dogs");
  4. string json = "{id:10,Age:25,Name:'superman',gender:true}";
  5. BsonDocument p2 = BsonDocument.Parse(json);
  6. dogs.InsertOne(p2);

4.2 查询

4.2.1 一般查询

重写Person

  1. public class Person
  2. {
  3. public ObjectId Id { get; set; }
  4. public string Name { get; set; }
  5. public int Age { get; set; }
  6. public override string ToString()
  7. {
  8. return $"{nameof(Id)}: {Id}, {nameof(Name)}: {Name}, {nameof(Age)}: {Age}";
  9. }
  10. }

先插入一些数据

  1. MongoClient client = new MongoClient("mongodb://localhost");
  2. IMongoDatabase database = client.GetDatabase("TestDb1");
  3. List<Person> list = new List<Person>();
  4. list.Add(new Person(){Age = 22,Name = "zhanghua"});
  5. list.Add(new Person(){Age = 24,Name = "fuqiang"});
  6. list.Add(new Person(){Age = 31,Name = "jishang"});
  7. list.Add(new Person(){Age = 42,Name = "liuqiangdon"});
  8. IMongoCollection<Person> collection = database.GetCollection<Person>("Persons");
  9. collection.InsertMany(list); //插入list

再查询

  1. public static async void Query()
  2. {
  3. MongoClient client = new MongoClient("mongodb://localhost");
  4. IMongoDatabase database = client.GetDatabase("TestDb1");//相当于数据库
  5. IMongoCollection<Person> collection = database.GetCollection<Person>("Persons");
  6. var filter1 = Builders<Person>.Filter.Gt(p => p.Age, 30);//Gt:大于。
  7. //多条件,复杂条件使用 linq
  8. //var filter2 = Builders<Person>.Filter.Where(p => p.Age > 30);//Gt:大于。
  9. var result = collection.Find<Person>(filter1);
  10. foreach (var item in result.ToList())
  11. {
  12. Console.WriteLine(item.ToString());
  13. }
  14. }

结果

  1. Id: 5bb79ee398acfb2f544a9521, Name: jishang, Age: 31
  2. Id: 5bb79ee398acfb2f544a9522, Name: liuqiangdon, Age: 42

4.2.2 大数据量查询

采用分批次查询。while(foreach...)

  1. //分批次查询(大数据量)
  2. public static async void QueryBigSize()
  3. {
  4. MongoClient client = new MongoClient("mongodb://localhost");
  5. IMongoDatabase database = client.GetDatabase("TestDb1");//相当于数据库
  6. IMongoCollection<Person> collection = database.GetCollection<Person>("Persons");
  7. var filter1 = Builders<Person>.Filter.Gt(p => p.Age, 30);//Gt:大于。
  8. //FindAsync<Person> 返回的是 IAsyncCursor<Person> ,实现的 IDisposable 接口,需要使用using
  9. //分组查询(按大小): FindOptionsBase.BatchSize
  10. using (var personsCursor = await collection.FindAsync<Person>(filter1, new FindOptions<Person>(){BatchSize = 1}))
  11. {
  12. while (personsCursor.MoveNext())
  13. {
  14. IEnumerable<Person> persons = personsCursor.Current;
  15. foreach (var p in persons)
  16. {
  17. Console.WriteLine(p);
  18. }
  19. }
  20. }
  21. }

为什么FindAsync不直接返回集合,而是要MoveNext之后返回一个集合呢?因为返回的数据量可能很大,因此MongoDB是分批下载,下载一批之后执行GET_More操作返回下一批。可以通过FindOptions参数的BatchSize设置每一批的大小。

  1. using (var personsCursor = await collection.FindAsync<Person>(filter1, new FindOptions<Person>(){BatchSize = 1}))
  2. {
  3. ...
  4. }

如果确认返回的数据量 不大,可以var ps = await personsCursor.ToListAsync()(或者ToEnumerable()等)一下子返回所有数据。还有Any、First、FirstOrDefault等以及异步操作。

需要注意MongoDB中查询区分大小写。

4.2.3 分页

使用FindOptions<TDocument, TProjection>

  1. // 摘要:
  2. // 查找文档的选项.
  3. //
  4. // 类型参数:
  5. // TDocument:
  6. // 文档的类型.
  7. //
  8. // TProjection:
  9. // 投影的类型 (如果没有投影, 则与 TDocument 相同)。
  10. FindOptions<TDocument, TProjection> : FindOptionsBase
  11. {
  12. public FindOptions();
  13. //获取或设置要返回的文档数。
  14. public int? Limit { get; set; }
  15. public ProjectionDefinition<TDocument, TProjection>
  16. //获取或设置在返回其余部分之前要跳过的文档数。
  17. public int? Skip { get; set; }
  18. //排序
  19. public SortDefinition<TDocument> Sort { get; set; }
  20. }

FindAsync 传入参数时,设置 FindOptions

  1. using (var personsCursor = await collection.FindAsync<Person>(filter1,
  2. new FindOptions<Person,Person>(){Limit = 2,Skip = 2}))
  3. {
  4. ...
  5. }

4.2.4 排序

  1. findOpt.Sort = Builders<Person>.Sort.Ascending(p => p.Age).Descending(p => p.Name);

这里可以

  1. using (var personsCursor = await collection.FindAsync<Person>(filter1,
  2. new FindOptions<Person,Person>()
  3. {
  4. Limit = 2,Skip = 2,
  5. //这里写Sort排序
  6. Sort = Builders<Person>.Sort.Ascending(p=>p.Age)
  7. }))
  8. {
  9. ...
  10. }

4.2.5 类型不确定,使用 Bson

如果用BsonDocument,有一些操作还是比较麻烦的:

而且不能使用linq了,只能使用Gt、Gte、In、Lt、Lte、Ne、Nin、Near、NearSphere、Or、Where、And、Not。等等。

  1. IMongoCollection<BsonDocument> persons = database.GetCollection<BsonDocument>("Persons");
  2. var filter1 = Builders<BsonDocument>.Filter.Gt("Age", 5);
  3. using (var personsCursor = await persons.FindAsync(filter1))
  4. {
  5. foreach (var p in await personsCursor.ToListAsync())
  6. {
  7. MessageBox.Show(p.GetValue("Name").AsString);
  8. }
  9. }

4.3 更新

用Update机会比较少,如果频繁的用Update可能意味着用错了;也不要想着join、group by,还是场景不对!

  1. IMongoCollection<Person> teachers = database.GetCollection<Person>("Persons");
  2. var filter = Builders<Person>.Filter.Where(p => p.Age <= 5);
  3. var update = Builders<Person>.Update
  4. .Set(p=>p.Age,8);
  5. teachers.UpdateMany(filter, update);

4.4 删除

  1. IMongoCollection<Person> teachers = database.GetCollection<Person>("Persons");
  2. var filter = Builders<Person>.Filter.Where(p => p.Age <= 5);
  3. teachers.DeleteMany(filter);

5 应用场景

日志记录系统;设备监控数据的存储;饿了么外卖骑手接单;存储商品、商家信息;网站评论信息;存储爬虫爬过来的第三方数据;

但是像订单、金融交易、游戏装备等这些关键信息不要用MongoDB;

MongoDB 入门的更多相关文章

  1. MongoDB 入门之基础 DCL

    此文章主要记录部分主要的 MongoDB 的 DCL 操作. MongoDB 默认不需要用户名和密码就可以用 mongodb.exe 登录 一.开启 MonogoDB 的权限模式 修改 MongoDB ...

  2. MongoDB入门三:MongoDB shell

    MongoDB shell MongDB shell是一个功能完备的Javascript解释器,可以运行Javascript程序.也可以用于连接MongoDB服务器,执行脚本,对数据库进行操作.类似于 ...

  3. MongoDB 入门之查询(find)

    MongoDB 入门之查询(find) 1. find 简介 (1)find的第一个参数决定了要返回哪些文档. 空的查询文档会匹配集合的全部内容.默认就是{}.结果将批量返回集合c中的所有文档. db ...

  4. MongoDB入门简介

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

  5. mongodb入门教程二

    title: mongodb入门教程二 date: 2016-04-07 10:33:02 tags: --- 上一篇文章说了mongodb最基本的东西,这边博文就在深入一点,说一下mongo的一些高 ...

  6. mongodb入门教程

    title: mongodb入门教程 date: 2016-04-06 14:47:18 tags: --- 为什么要认识呢,因为这玩意就一傻逼 借用一下百科的介绍 MongoDB 是一个介于关系数据 ...

  7. MongoDb 入门教程

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

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

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

  9. mongodb入门很简单(3)

     ##简单的mongodb入门命令## 1.show dbs;      //查看当前数据库 2.use databaseName;         //选库 3.show tables/collec ...

  10. MongoDB入门实践

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

随机推荐

  1. SpringCloud概述

    ⒈官网说明 SpringCloud是基于SpringBoot提供了一套微服务解决方案,包括服务注册与发现.配置中心.全链路监控.服务网关.负载均衡.熔断器等组件,除了基于Netflix的开源组件做高度 ...

  2. Matplotlib(used in paper)

    1. 转自:matplotlib 使用 plt.savefig() 输出图片去除旁边的空白区域 注:如果不采用 subplot_adjust + margin(0,0),而是在fig.savefig( ...

  3. webstorm的快捷键总结

    ctrl+shift+f 可以在项目和模块中的文件中查找特定字符串 shift键连续敲一下,可以在项目和模块中查找特定的文件 ctrl+d  复制当前行并粘贴到下一行 ctrl+shift+上下方向键 ...

  4. window10 matlabR2015b 安装minGw

    第一步:下载TDM-GCC(注意看清是32位还是64位),TDM-GCC的安装路径不要包括空格: http://tdm-gcc.tdragon.net/download 第二步:点击“我的电脑”右键“ ...

  5. 在operator =中要处理“自我赋值”

    防止自我赋值很有必要 Widget w; w = w; a[i] = a[j]; //a[i]和a[j]实际上指向同一个元素 *pi = *pj; //pi和pj实际上指向同一个元素 自我赋值的危害: ...

  6. Ex 7_17 考虑如下的网络(其中数字为对应边的容量)...第十三次作业

    (a) 利用ford-fulkerson算法即可求出最大流和最小分割. (b) 剩余网络为 由S可达的顶点为A.B.可达T的顶点为C. (c) 瓶颈边有e(A,C),e(B,C). (d) 下图中不包 ...

  7. Arrays.asList()vs Collections.singletonList()

    Collections.singletonList(something)是不可变的, 对Collections.singletonList(something)返回的列表所做的任何更改将导致Unsup ...

  8. Tp5自定义标签

    'taglib_build_in'    => 'cx,tags', // 内置标签库名称(标签使用不必指定标签库名称),以逗号分隔 注意解析顺序 <?php namespace thin ...

  9. PHP中$_POST和$_GET的用法

    post和get是指:页面提交的两种方式get:参数都体现在url上,可以用于翻页,简单查询,get只能接收2M以下的内容,所以有局限性,另外由于内容是可见的,安全性就下降了,post:用于页面表单 ...

  10. python深浅拷贝与赋值

    初学编程的小伙伴都会对于深浅拷贝的用法有些疑问,今天我们就结合python变量存储的特性从内存的角度来谈一谈赋值和深浅拷贝~~~ 预备知识一——python的变量及其存储 在详细的了解python中赋 ...