1 MongoDb 简介
MongoDB是为互联网而生的数据库,是文档数据库。
1.1 优点:
-
Schema-less
,不需要预先定义表结构,同一个“表”中可以保存多个格式的数据; - 数据支持嵌套,数据以json格式存储;
- 允许使用JavaScript写服务端脚本,类似于存储过程;
- 支持Map/Reduce;
- MongoDB支持地理位置索引,可以直接用于位置距离计算和查询,实现“附近的人”、
“滴滴打车接单”等很容易;
1.2 缺点:
- Mongodb没有“数据一致性检查”、“事务”等,不适合存储对数据事务要求高(比如金融)的数据;只适合放非关键性数据(比如日志或者缓存)。
- 关联查询很弱,不适合做报表查询
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下,内容是:
systemLog:
destination: file
path:D:\Mongodb\log\mongod.log
storage:
dbPath: D:\Mongodb\db
把配置文件中的文件夹创建起来。
2) 注册成系统服务:
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 类插入
MongoClient client = new MongoClient("mongodb://localhost");
IMongoDatabase database = client.GetDatabase("TestDb1");//相当于数据库
IMongoCollection<Person> collection = database.GetCollection<Person>("Persons");//大致相当于“表”
Person p1 = new Person();
p1.Id = 2;
p1.Name = "sanwa";
p1.Age = 22;
collection.InsertOne(p1);//也支持异步方法,后面建议都用异步的!习惯成自然!
MongoDB里面:
(1)新插入的数据,MongoDB会自动创建“数据库”以及Collection(约等于“表”)。
(2)MongoDB默认用id做主键,因此不用显式指定id是主键。Id 对应 _id
(3)MongoDB中没有内置“自增字段
”,可以把Id声明为ObjectId
类型(using MongoDB.Bson)这样插入以后就自动给字段赋值。
public ObjectId Id { get; set; }
再重新插入一次。
4.1.2 Json插入
MongoClient client = new MongoClient("mongodb://localhost");
IMongoDatabase database = client.GetDatabase("TestDb1");//相当于数据库
IMongoCollection<BsonDocument> dogs = database.GetCollection<BsonDocument>("Dogs");
string json = "{id:10,Age:25,Name:'superman',gender:true}";
BsonDocument p2 = BsonDocument.Parse(json);
dogs.InsertOne(p2);
4.2 查询
4.2.1 一般查询
重写Person
public class Person
{
public ObjectId Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
public override string ToString()
{
return $"{nameof(Id)}: {Id}, {nameof(Name)}: {Name}, {nameof(Age)}: {Age}";
}
}
先插入一些数据
MongoClient client = new MongoClient("mongodb://localhost");
IMongoDatabase database = client.GetDatabase("TestDb1");
List<Person> list = new List<Person>();
list.Add(new Person(){Age = 22,Name = "zhanghua"});
list.Add(new Person(){Age = 24,Name = "fuqiang"});
list.Add(new Person(){Age = 31,Name = "jishang"});
list.Add(new Person(){Age = 42,Name = "liuqiangdon"});
IMongoCollection<Person> collection = database.GetCollection<Person>("Persons");
collection.InsertMany(list); //插入list
再查询
public static async void Query()
{
MongoClient client = new MongoClient("mongodb://localhost");
IMongoDatabase database = client.GetDatabase("TestDb1");//相当于数据库
IMongoCollection<Person> collection = database.GetCollection<Person>("Persons");
var filter1 = Builders<Person>.Filter.Gt(p => p.Age, 30);//Gt:大于。
//多条件,复杂条件使用 linq
//var filter2 = Builders<Person>.Filter.Where(p => p.Age > 30);//Gt:大于。
var result = collection.Find<Person>(filter1);
foreach (var item in result.ToList())
{
Console.WriteLine(item.ToString());
}
}
结果
Id: 5bb79ee398acfb2f544a9521, Name: jishang, Age: 31
Id: 5bb79ee398acfb2f544a9522, Name: liuqiangdon, Age: 42
4.2.2 大数据量查询
采用分批次查询。while(foreach...)
//分批次查询(大数据量)
public static async void QueryBigSize()
{
MongoClient client = new MongoClient("mongodb://localhost");
IMongoDatabase database = client.GetDatabase("TestDb1");//相当于数据库
IMongoCollection<Person> collection = database.GetCollection<Person>("Persons");
var filter1 = Builders<Person>.Filter.Gt(p => p.Age, 30);//Gt:大于。
//FindAsync<Person> 返回的是 IAsyncCursor<Person> ,实现的 IDisposable 接口,需要使用using
//分组查询(按大小): FindOptionsBase.BatchSize
using (var personsCursor = await collection.FindAsync<Person>(filter1, new FindOptions<Person>(){BatchSize = 1}))
{
while (personsCursor.MoveNext())
{
IEnumerable<Person> persons = personsCursor.Current;
foreach (var p in persons)
{
Console.WriteLine(p);
}
}
}
}
为什么FindAsync不直接返回集合,而是要MoveNext之后返回一个集合呢?因为返回的数据量可能很大,因此MongoDB是分批下载,下载一批之后执行GET_More操作返回下一批。可以通过FindOptions
参数的BatchSize
设置每一批的大小。
using (var personsCursor = await collection.FindAsync<Person>(filter1, new FindOptions<Person>(){BatchSize = 1}))
{
...
}
如果确认返回的数据量 不大,可以var ps = await personsCursor.ToListAsync()(或者ToEnumerable()等)一下子返回所有数据。还有Any、First、FirstOrDefault等以及异步操作。
需要注意MongoDB中查询区分大小写。
4.2.3 分页
使用FindOptions<TDocument, TProjection>
。
// 摘要:
// 查找文档的选项.
//
// 类型参数:
// TDocument:
// 文档的类型.
//
// TProjection:
// 投影的类型 (如果没有投影, 则与 TDocument 相同)。
FindOptions<TDocument, TProjection> : FindOptionsBase
{
public FindOptions();
//获取或设置要返回的文档数。
public int? Limit { get; set; }
public ProjectionDefinition<TDocument, TProjection>
//获取或设置在返回其余部分之前要跳过的文档数。
public int? Skip { get; set; }
//排序
public SortDefinition<TDocument> Sort { get; set; }
}
FindAsync 传入参数时,设置 FindOptions
using (var personsCursor = await collection.FindAsync<Person>(filter1,
new FindOptions<Person,Person>(){Limit = 2,Skip = 2}))
{
...
}
4.2.4 排序
findOpt.Sort = Builders<Person>.Sort.Ascending(p => p.Age).Descending(p => p.Name);
这里可以
using (var personsCursor = await collection.FindAsync<Person>(filter1,
new FindOptions<Person,Person>()
{
Limit = 2,Skip = 2,
//这里写Sort排序
Sort = Builders<Person>.Sort.Ascending(p=>p.Age)
}))
{
...
}
4.2.5 类型不确定,使用 Bson
如果用BsonDocument,有一些操作还是比较麻烦的:
而且不能使用linq了,只能使用Gt、Gte、In、Lt、Lte、Ne、Nin、Near、NearSphere、Or、Where、And、Not。等等。
IMongoCollection<BsonDocument> persons = database.GetCollection<BsonDocument>("Persons");
var filter1 = Builders<BsonDocument>.Filter.Gt("Age", 5);
using (var personsCursor = await persons.FindAsync(filter1))
{
foreach (var p in await personsCursor.ToListAsync())
{
MessageBox.Show(p.GetValue("Name").AsString);
}
}
4.3 更新
用Update机会比较少,如果频繁的用Update可能意味着用错了;也不要想着join、group by,还是场景不对!
IMongoCollection<Person> teachers = database.GetCollection<Person>("Persons");
var filter = Builders<Person>.Filter.Where(p => p.Age <= 5);
var update = Builders<Person>.Update
.Set(p=>p.Age,8);
teachers.UpdateMany(filter, update);
4.4 删除
IMongoCollection<Person> teachers = database.GetCollection<Person>("Persons");
var filter = Builders<Person>.Filter.Where(p => p.Age <= 5);
teachers.DeleteMany(filter);
5 应用场景
日志记录系统;设备监控数据的存储;饿了么外卖骑手接单;存储商品、商家信息;网站评论信息;存储爬虫爬过来的第三方数据;
但是像订单、金融交易、游戏装备等这些关键信息不要用MongoDB;
MongoDB 入门的更多相关文章
-
MongoDB 入门之基础 DCL
此文章主要记录部分主要的 MongoDB 的 DCL 操作. MongoDB 默认不需要用户名和密码就可以用 mongodb.exe 登录 一.开启 MonogoDB 的权限模式 修改 MongoDB ...
-
MongoDB入门三:MongoDB shell
MongoDB shell MongDB shell是一个功能完备的Javascript解释器,可以运行Javascript程序.也可以用于连接MongoDB服务器,执行脚本,对数据库进行操作.类似于 ...
-
MongoDB 入门之查询(find)
MongoDB 入门之查询(find) 1. find 简介 (1)find的第一个参数决定了要返回哪些文档. 空的查询文档会匹配集合的全部内容.默认就是{}.结果将批量返回集合c中的所有文档. db ...
-
MongoDB入门简介
MongoDB入门简介 http://blog.csdn.net/lolinzhang/article/details/4353699 有关于MongoDB的资料现在较少,且大多为英文网站,以上内容大 ...
-
mongodb入门教程二
title: mongodb入门教程二 date: 2016-04-07 10:33:02 tags: --- 上一篇文章说了mongodb最基本的东西,这边博文就在深入一点,说一下mongo的一些高 ...
-
mongodb入门教程
title: mongodb入门教程 date: 2016-04-06 14:47:18 tags: --- 为什么要认识呢,因为这玩意就一傻逼 借用一下百科的介绍 MongoDB 是一个介于关系数据 ...
-
MongoDb 入门教程
MongoDb 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的. 它是可扩展的高性能数据存储解决方案,经常被用于非关系型数据的存储,能存储海量的数据. 常 ...
-
MongoDB入门必读(概念与实战并重)
MongoDB入门必读(概念与实战并重) 一.概述 MongoDB是一个基于分布式文件存储的数据库开源项目.由C++语言编写.旨在为WEB应用提供可护展的高性能数据存储解决方案. MongoDB是一个 ...
-
mongodb入门很简单(3)
##简单的mongodb入门命令## 1.show dbs; //查看当前数据库 2.use databaseName; //选库 3.show tables/collec ...
-
MongoDB入门实践
MongoDB入门实践 简单介绍MongoDB,包括MongoDB的使用场景.和MySQL的对比.安装部署.Java客户端访问及总结 MongoDB? 我们遵循需求驱动技术的原则,通过一个场景来引入M ...
随机推荐
-
HP QR Code 实现二维码
二维码简单点说就是图片中含有数据信息,可以是url链接,也可能是其他的 首先下载该类,(http://download.csdn.net/detail/cgjcgs/9100365) 然后直接引入该类 ...
-
jquery可见性选择器(匹配匹配所有显示的元素)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
-
SqlServer分区表概述(转载)
什么是分区表 一般情况下,我们建立数据库表时,表数据都存放在一个文件里. 但是如果是分区表的话,表数据就会按照你指定的规则分放到不同的文件里,把一个大的数据文件拆分为多个小文件,还可以把这些小文件放在 ...
-
CocoaPods 教程 转载
CocoaPods安装和使用教程 Code4App 原创文章.转载请注明出处:http://code4app.com/article/cocoapods-install-usage 目录 CocoaP ...
-
进一步解 apt-get 的几个命令
用 apt-get 也非常久了,没多想它的实现,近期遇到 gstreamer 装不上的问题.才多看看了它 apt-get 就是从网上下载包,并安装到本地 手工下载 dpkg 包,而后 "dp ...
-
用mp3stego来加密与解密文件的几次尝试
用法来自实验吧的"Canon"隐写题目的灵感. 先来简单的聊一下这道题目,打开题目后发现了一个mp3文件,除此之外还有一枚压缩包.然而压缩包是加密的,看来我们需要通过解出来mp3里 ...
-
基于oracle的sql优化
[基于oracle的sql优化] 基于oracle的sql优化 [博主]高瑞林 [博客地址]http://www.cnblogs.com/grl214 一.编写初衷描述 在应有系统开发初期,由于数据库 ...
-
vue ssr github 项目及其 文章
https://github.com/Liao123/vue-js-webpack-ssr 这个项目可以完美运行 npm run start 是运行
-
GraphQL Gateway Architectures
转自: https://tomasalabes.me/blog/graphql/node/microservices/2018/08/11/graphql-architectures.html Gra ...
-
servlet和jsp概述
1.servlet的作用 B/S系统:浏览器/服务器(Servlet的服务模式) Servlet是运行在web服务器或应用服务器上的java程序,它是一个中间层,负责连接来自web浏览器或其它HTTP ...