Author:SimpleWu

MongoDB官方网:https://www.mongodb.com/

MongoDB中文网:http://www.mongodb.org.cn/

什么是MongoDB?

NoSQL(NoSQL = Not Only SQL ),意即"不仅仅是SQL"。

NoSQL,指的是非关系型的数据库。NoSQL有时也称作Not Only SQL的缩写,是对不同于传统的关系型数据库的数据库管理系统的统称。

NoSQL用于超大规模数据的存储。(例如谷歌或Facebook每天为他们的用户收集万亿比特的数据)。这些类型的数据存储不需要固定的模式,无需多余操作就可以横向扩展。

NoSQL 是一项全新的数据库革命性运动,早期就有人提出,发展至2009年趋势越发高涨。NoSQL的拥护者们提倡运用非关系型的数据存储,相对于铺天盖地的关系型数据库运用,这一概念无疑是一种全新的思维的注入。

而MongoDB就不仅仅是SQL。

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

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

MongoDB将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。

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

官方下载网站:https://www.mongodb.com/download-center/community,支持N多平台操作系统。

我们这里下载MongoDB的3.4,windows64位操作系统的解压包,ZIP是绿色版,MSI是安装版。

安装一路next就成。

4个文件是协议不需要管,bin目录里面的是可执行文件,但是这个时候我们是无法使用mongodb的,我们还是要将它添加到环境变量中。

创建一个MongoDB_HOME=D:\JAVA\mongodb,然后在将%MongoDB_HOME%\bin加入到path目录

这个时候我们运行cmd打开小黑屋运行命名:mongod,这个时候运行是失败的:

错误原因是:c:data\db\这个目录不存在,最简单的办法就是创建一个,不过个人不喜欢把文件放在C盘,并且以这种方式启动会一直有个窗口感觉非常不爽。

在服务中运行:

我们首先在mongoDB安装后的bin目录里创建一个mongod.cfg,里面添加如下内容

systemLog:
destination: file
path: D:\JAVA\mongodb\log\mongodb.log #如果没有目录必须要创建
storage:
dbPath: D:\JAVA\mongodb\db\ #如果没有目录必须要创建

使用mongod --config "D:\JAVA\mongodb\bin\mongod.cfg" –install --serviceName "MongoDB" 安装服务,需要管理员权限。

芒果DB服务命令:

net start MongoDB   #启动服务
net stop MongoDB #关闭服务
mongod –remove #移除服务(需要管理员权限。)
sc delete MongoDB 删除服务

我们使用命令之后这个时候我们的服务中会有个MongoDB服务并且在运行中。

这个时候我们就可以使用命令mongo连接上我们的数据库。

附上一张mongoDB参数列表图:

使用MongoDB的时候如果不喜欢黑窗口的可以去度娘问问gui界面。

数据库指令
/*查看当前数据库*/
show dbs;
/* 如果数据库不存在,则创建数据库,否则切换到指定数据库。
注意:这里的数据库并不是一定要存在的,如果不存在,在创建文档时会自动创建。
*/
use MyDB;
/*删除当前数据*/
MyDB.dropDatabase();
/*显示当前所在数据*/
db;
集合操作指令

查看当前所有集合: show collections;

创建集合语法: db.createCollection(name,options)

name:集合的名称,options:可选参数,指定有关内存大小及索引的选项。

删除集合语法:db.集合名.drop()

常用命令操作

Employee是我创建的一个集合

插入一条文档:

db.Employee.insertOne({name:"SimpleWu",Email:"lovelyWu@gmail.com",QQ:450255266});

插入多条文档:

db.Employee.insertMany([
{
name:"李白",
Email:"libai@gmail.com",
QQ:123456789
},
{
name:"韩信",
Email:"hanxin@gmail.com",
QQ:987654231
}
]);

插入一条文档或插入多条文档:

db.Employee.insert({name:"武则天",Email:"wuzetian@gmail.con",QQ:1111111});
db.Employee.insert([
{
name:"嬴政",
Email:"yingzheng@gmail.com",
QQ:555555
},
{
name:"安琪拉",
Email:"anqila@gmail.com",
QQ:66666
}
])

批量插入文档:

for(var i = 0 ; i <= 50000 ; i ++ ){
db.Employee2.insert({num:"鲁班" + i + "号"});
}

注意我们这样插入文档50000条数据花费了将近20秒这是非常残酷的,我而我们可以这样优化,优化后只需要0.5秒。

var array = [];
for(var i = 0;i<=50000;i++){
array.push({num:"鲁班"+ i +"号"});
}
db.Employee2.insert(array);

查询文档:

db.Employee.find();

注意:如果在插入时,不指定_id属性,则数据库会自动生成一个_id,取值为ObjectId()。如果指定了_id,则不会生成。

更新文档语法:

db.collection.update(
<query>,
<update>,
{
upsert: <boolean>,
multi: <boolean>,
writeConcern: <document>
}
)

multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。writeConcern :可选,抛出异常的级别。

update默认会用update的对象替换原有对象:

db.Employee.update({name:"李白"},{name:"李小白"});

如果想修改指定的属性,而不是修改所有内容,则要使用修改操作符。 $set可以用来修改指定属性

db.Employee.update({name:"李小白"},{$set:{name:"李白"}});

$unset可以移除某个属性,移除属性的值可以随便填

db.Employee.update({name:"武则天"},{$unset:{QQ:""}});

如果匹配到多个,update也只会删除一条记录。要删除多条,需要使用multi属性

db.Employee.update({name:"SimpleWu"},{$set:{name:"LovelyWu"}},{mluti:true});

save() 方法通过传入的文档来替换已有文档。语法格式如下:

db.collection.save(
<document>,
{
writeConcern: <document>
}
)

document : 文档数据。 writeConcern :可选,抛出异常的级别。

注意:若新增数据的主键已经存在,则会对当前已经存在的数据进行修改操作。

插入:

db.Employee.save({name:"SimpleWu",gender:"男",email:"lovelyWu98k@gmail.com"});
/*
_id存在变成更新操作
*/
db.Employee.save({ _id:ObjectId("5bf7b8cde756c09cc38dd79f"),name:"Wu帅帅",gender:"男",email:"lovelyWu98k@gmail.com"});

删除文档语法remove() 方法:

db.collection.remove(
<query>,
{
justOne: <boolean>,
writeConcern: <document>
}
)
  • query :(可选)删除的文档的条件。
  • justOne : (可选)如果设为 true 或 1,则只删除一个文档。
  • writeConcern :(可选)抛出异常的级别。
db.Employee.remove({gender:"男"});//删除所有符合条件的文档
db.Employee.remove({gender:"男"},{justOne:true});//删除一条
db.Employee.remove();//删除集合中所有文档

查询文档:

db.collection.find(query, projection)

参数说明query :可选,使用查询操作符指定查询条件

projection :可选,使用投影操作符指定返回的键。查询时返回文档中所有键值, 只需省略该参数即可(默认省略)。

如果你需要以易读的方式来读取数据,可以使用 pretty() 方法,语法格式如下:db.col.find().pretty()

db.Employee.find({name:"SimpleWu"},{gender:0});//查询name是SimpleWu的文档数据,排除gender显示
db.Employee.find({name:"SimpleWu"},{gender:1});//查询name是SimpleWu的文档数据,只显示gender

注意这个0代表的就是排除,1代表的是要它不要其他的,在这里0和1不能混合使用

在这里需要注意不管是不是只显示gender反正我们的_id是特殊的一列,所以我们没有排除_id它绝对会显示出来

那么我们只要显示gender:1怎么办呢很简单在加个_id=1,但是上面不是说不能0和1混合使用吗?

在mongoDB中,主键是特殊的一个字段

条件运算符:

等值判断 $eq:

db.Employee.find({name:"SimpleWu"});
db.Employee.find({name:{$eq:"SimpleWu"}});

判断小于$lt:

db.Employee.find({QQ:{$lt:450255266}});

判断大于$gt:

db.Employee.find({QQ:{$gt:450255266}});

判断小于等于$elt:

db.Employee.find({QQ:{$elt:450255266}});

判断大于等于egt:

db.Employee.find({QQ:{$egt:450255266}});

与条件判断:

//判断name=SimpleWu 同时gender=男
db.Employee.find({name:"SimpleWu",gender:"男"});

或条件判断:

db.Employee.find({$or:[{name:"武则天"},{name:"SimpleWu"}]});

学习某一项技术首先查询官方文档,官方文档是最全的,并且跟着官方文档走可以让我们少掉进许多坑。

总结:

文档是Mongodb中的最基本数据单元,类似于关系数据库中的行。

在mongodb中,文档的键通常都是字符串。Mongodb对文档的键是区分大小写的,对键值是区分数据类型的

MongoDB的文件存储格式为BSON,同JSON一样支持往其它文档对象和数组中再插入文档对象和数组,同时扩展了JSON的数据类型.与数据库打交 道的那些应用。

MongoDB文档的字段非常灵活

首次体验MangoDB的更多相关文章

  1. Hexo初体验

    title: Hexo初体验 date: 2018-05-10 tags: Hexo categories: Hexo --- Hexo本地安装 Node.js安装 Hexo npm安装如下 npm ...

  2. 分享:使用 TypeScript 编写的 JavaScript 游戏代码

    <上篇博客>我写出了我一直期望的 JavaScript 大型程序的开发模式,以及 TS(TypeScript) 的一些优势.博客完成之后,我又花了一天时间试用 TS,用它来重构之前编写的一 ...

  3. Microsoft Message Analyzer (微软消息分析器,“网络抓包工具 - Network Monitor”的替代品)官方正式版现已发布

    来自官方日志的喜悦 被誉为全新开始的消息分析器时代,由MMA为您开启,博客原文写的很激动,大家可以点击这里浏览:http://blogs.technet.com/b/messageanalyzer/a ...

  4. 关于VR技术和未来发展---转

    原文地址:http://mp.weixin.qq.com/s?__biz=MzA4MTIwNTczMQ==&mid=2651345594&idx=3&sn=2741ab7321 ...

  5. 【初识——最大流】 hdu 1532 Drainage Ditches(最大流) USACO 93

    最大流首次体验感受—— 什么是最大流呢? 从一个出发点(源点),走到一个目标点(汇点),途中可以经过若干条路,每条路有一个权值,表示这条路可以通过的最大流量. 最大流就是从源点到汇点,可以通过的最大流 ...

  6. Hexo博客搭建图文教程

    准备 你需要准备好以下软件: Node.js环境 Git Windows 配置Node.js环境 下载Node.js安装文件: Windows Installer 32-bit Windows Ins ...

  7. ui原则

    http://www.niushe.com/news/show-3683.html 设计师Joshua Porter发表了一篇文章——<Principles of User Interface ...

  8. Microsoft Message Analyzer (微软消息分析器,“网络抓包工具 - Network Monitor”的替代品)官方正式版现已发布

    Microsoft Message Analyzer (微软消息分析器,“网络抓包工具 - Network Monitor”的替代品)官方正式版现已发布 来自官方日志的喜悦 被誉为全新开始的消息分析器 ...

  9. 3rd-Bing Dict使用分析

    英语学习APP的案例分析 0x00 写在前面 我们生活中很多时候要和软件打交道,大家上课开小差时候玩的手机游戏,买火车票的网站,互相联系用的微信.QQ,等等都是软件,都很值得分析.你为何成为它们的用户 ...

随机推荐

  1. LuoguP5290 [十二省联考2019]春节十二响 | 启发式合并

    还有33天就要高考了,我在干啥-- 题目概述 一棵有根树,每个节点有权值. 要求把所有节点分成组,具有祖先-后代关系的两个节点不能被分到同一组. 每一组的代价是所包含的节点的最大权值,最小化所有组的代 ...

  2. 特征金字塔网络Feature Pyramid Networks

    小目标检测很难,为什么难.想象一下,两幅图片,尺寸一样,都是拍的红绿灯,但是一副图是离得很近的拍的,一幅图是离得很远的拍的,红绿灯在图片里只占了很小的一个角落,即便是对人眼而言,后者图片中的红绿灯也更 ...

  3. 用Python完成毫秒级抢单,助你秒杀淘宝大单

    目录: 引言 环境 需求分析&前期准备 淘宝购物流程回顾 秒杀的实现 代码梳理 总结 0 引言 年中购物618大狂欢开始了,各大电商又开始了大力度的折扣促销,我们的小胖又给大家谋了一波福利,淘 ...

  4. matplotlib基础

    Matplotlib 基础 注:本文中的程序都默认引入了numpy库和matplotlib库,并且分别简写为np与plt:如果读者不知道怎么使用numpy库,可以移步到这一博客上进行简单的学习 一.简 ...

  5. Kafka学习笔记之Kafka High Availability(上)

    0x00 摘要 Kafka在0.8以前的版本中,并不提供High Availablity机制,一旦一个或多个Broker宕机,则宕机期间其上所有Partition都无法继续提供服务.若该Broker永 ...

  6. .NetCore+WebUploader实现大文件分片上传

    项目要求通过网站上传大文件,比如视频文件,通过摸索实现了文件分片来上传,然后后台进行合并. 使用了开源的前台上传插件WebUploader(http://fex.baidu.com/webupload ...

  7. 十:装饰器模式(io流)

    定义:装饰模式是在不必改变原类文件和使用继承的情况下,动态的扩展一个对象的功能.它是通过创建一个包装对象,也就是装饰来包裹真实的对象.                  这一个解释,引自百度百科,我们 ...

  8. 最新版windows安装支持输入shell命令的工具cygwin教程

    首先去官网下载自己对应系统32位或64位系统版本安装包:https://cygwin.com/install.html 下载好后按提示一步一步安装,直到这一步: 初次安装,这里是空的,没有下载的镜像链 ...

  9. SQLServer常用快捷键汇总

    菜单激活键盘快捷键 操作 SQL Server 2017 SQL Server 2008 R2 移到 SQL Server Management Studio 菜单栏 Alt Alt 激活工具组件的菜 ...

  10. qt需求

    1.登录框 账号密码 复杂度判断 2.监控  权限认证 (5分钟必须锁定,退回登录状态)--b/s 3.exe 嵌入exe (什么时间触发了什么消息,任何消息触发都可以,日志文件zlog,5分钟没有写 ...