Mongodb

  • 简介

NoSQL 的概念:指的是非关系型数据库。 NOT only sql 的缩写。特别适用于大规模

的数据存储。例如:谷歌或者facebook 每天为用户收集亿万级别的数据,这些数据类型不需要固定的格式,无需多余的操作就可以进行横向扩展。

什么是mongodb?

是C++语言开发,性能比较好,可以为web应用提供扩展的高性能数据存储解决方案。Mongodb将数据存储为一个文档,数据结构由键值(key è value)对组成,文档类似于 json对象,并且字段值可以包含其它文档,即文档可以进行嵌套,还可以是数组,文档数组等等。

JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。

{“name”:”joho”,”age”:18,”address”:{“country”:”china”,”zip-code”:”10000”}}

Mongodb 是一个介于关系型数据库和非关系型数据之间的产品,是一个最像关系型数据库的非关系型数据库产品。它支持的数据类型非常的松散,多元。存储格式类似json格式,叫bson(二进制Json),因此支持存储的数据更丰富和复杂。

{name:”sue”,

AGE:26,

Status:”A”,

Groups:[“new”,”sports”]

}

MongoDB最大的特点是支持的查询语言非常强大,语法有点类似面向对象的查询语句,几乎可以实现关系型数据库绝大多数功能,并且支持索引。

缺点:不支持连表查询,不支持事务存储过程,不适用于数据间关系比较复杂的数据,一般都是当做数据仓库来使用。

例如:适用于:日志系统,股票数据系统等等

不适用于:电子商务平台,物流系统等等,数据关系复杂的系统。

Mongodb 和 mysql 性能进行比较

前提:分别插入 100万条数据记录,并对其中100个用户并发查询

  • Mongodb 概念解析

在mongodb 中基本概念有: 文档 、 集合 、数据库、数据体系

  1. 文档

文档是mongodb 中最基本的单元,类似于关系型数据库中的行(数据记录),多个键

值对有序的放置在一起的便是一个文档。

Mongodb 中以文档的存储方式记录数据,如一条记录格式如下:

{“username”:”shasha”,”age”:18,”email”:”shasha@126.com”,’sex’:’男’}

{“username”:”shasha2”,”age”:”18”}

{“username”:”shasha22”}

{name:”sue”,AGE:26,Status:”A”,Groups:[“new”,”sports”]}

注意:1)以上是几个不同的文档,mongodb 是区分大小写的数据类型,第一个文档中18表示数字类型,第二个文档中 age 是字符串类型。

2)每个文档尺寸不能超过16M

3)文档中键/值 对是有序的,值不仅可以在双引号里面的字符串,还可以是其他数据类型,或者是嵌套一个完整的文档。

4)一个文档中不能有重复的键。

2、集合

集合就是一组文档,多个文档组成一个集合,集合类似于mysql里面的表。集合是无模式的,是指在同一个集合中可以包含不同格式的文档,如:

{“username”:”shasha”,”age”:18,”email”:”shasha@126.com”,’sex’:’男’}

{“username”:”shasha22”}

{“name”:”joho”,”age”:18,”address”:{“country”:”china”,”zip-code”:”10000”}}

以上三个文档可以放在同一个集合中。如果是在mysql数据库中,需要先创建表,再插入数据,并且数据格式要一致。MongoDB 中集合的模式自由,集合中没有行和列的概念,没有固定的格式,即同一个集合可以插入不同格式的数据(文档),不同类型的文档。

注意:MongoDB 中集合不用创建,没有结构,在插入第一个文档的时候,集合可以同步创建。

合法的集合名

集合名不能是空字符“”。

集合名不能包含\0 字符,这个字符表示的是集合名的结尾。

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

用户创建的集合名字不能包含保留字符,有些驱动程序确实支持集合里面包含保留字符,但是大多数不支持,例如名字中包含  $  ,不要在名字中出现。

3、数据库

多个集合可以组成数据库,一个MongoDB实例中可以承载多个数据库,他们之间完全

独立,mongodb中的数据库概念和 MySQL 中数据库概念类似,都是用来存储数据的,只是mongodb 中的数据库无需创建。

特点:一个数据库中可以有多个集合

一个集合中可以有多个文档

数据库也是通过名字来标识的,数据库名可以是有以下满足条件的任意的utf-8字符串。

不能有空字符:””

不能含有空格,或者. 或者 $ 或者 / 、 \ 、\0

应全部小写

最多64个字节

4、MongoDB的数据体系

  • MongoDB 安装配置

1、windows 环境下安装 mongodb

下载安装包

安装

启动服务

客户端打开,测试连接

详见《Windows 下部署搭建mongodb.docx》

  1. linux 下环境安装

详细内容参照操作说明手册

  • 入门语句
  1. 创建数据库

语法: use 数据库名称

  1. 查看数据库

语法:show dbs

Mongodb 默认有3个数据库:admin、local 、config

Admin: 管理权限的,添加 root 用户,用来管理其他所有非root 用户的权限,有一些特定的服务器命令必须在admin 库下执行;

Local: 这个数据永远不会被赋值,可以用来存储限于本地单台服务器的任何集合;

Config:当mongodb 用于分片设置时,config 数据库在内部使用,用于保存分片信息。

  1. 创建集合

注意:mongodb 里面的集合是隐式创建,就是无需创建,直接使用。

语法:db.集合名.insert({})  意思:向集合里面添加文档。这个集合会在语句执行的创建同时把文档插入其中。

db.clco2.insert({"username":"jojo","age":36,"sex":"女"});

db.clco2.insert({"username":"jojo222",age:36,"sex":"女"});

db.clco2.insert({"username":"jojo222",age:36,'sex':'女'});

4、查看集合

语法:show tables

show collections

  1. 查看集合中的文档

语法: db.集合名.find()   查询所有

db.集合名.findOne() 查询的是第一个文档

6、删除集合

语法: db.集合名.drop();

7、删除数据库

语法:db.dropDatabase(),删除的是当前所在的数据库

8、帮助命令

数据库相关的帮助命令

语法:db.help()

集合相关的帮助命令

语法:db.集合名.help()

五、增删改查操作

1、添加文档

语法: db.集合名.insert({k1:’v1’,k2:’v2’,…})

3.2版本以后插入文档的语法还支持如下:

db.collection.insertOne():向指定的集合插入一条文档数据,只能插入一条

db.collection.insertMany():向指定的集合中插入多条文档数据,多个文档作为一个列表,文档之间用, 间隔。

db.集合名.insertMany([{},{},{}])

/* 添加文档 */

show dbs;

use test;

db.php.insert([{name:'hanmeimei',age:'8',sex:'女'},{name:"呜呜"}]);

db.php.insert({name:'lily1',age:'8',sex:'女'});

db.php.find();

db.php.insertOne({name:'lilei22',age:'8',sex:'女'});

db.php.insertMany([{name:"呼呼"},{name:"haha"},{age:'28'}]);

注意点:文档就是键值对,数据类型是 BSON,是json的扩展,支持的值更丰富

ObjectID 类型:

每个文档都有一个_id字段,并且同一个集合中_id的值是唯一的,该字段可以是任意类型的数据,默认就是一个ObjectID 对象。

ObjectID 对象数据组成:时间戳|机器码|PID|计数器,_id键值我们自己定义输入,但是一定不能重复,如果自己不输入,就会系统默认自动生成。

> db.php.insert({'_id':100,name:'sunsun'});

WriteResult({ "nInserted" : 1 })

可以使用js 代码来完成批量插入文档

// 方法一:循环实现

for( var i=1;i<=100;i++)

{

db.php222.insert({'name':'xiaoxiao'+i,age:i,'email':'xiaoxiao'+i+'@126.com'});

};

db.php222.find()

// 方法二:1)先创建列表;2)将数据放在列表中;3)一次insert 到集合中

var arr=[];

for(var i=200;i<=2000;i++){

arr.push({num:i});

};

db.php333.insert(arr);

db.php333.find();

  1. 删除文档

语法:db.集合名.remove({条件})     (不写条件删除所有的集合中的文档)

db.php22.find();

db.php.find();

db.php.remove({name:'呜呜'});

db.php222.remove({});     // 表示删除集合中所有的数据

常见的操作符:

$eq,$lt,$lte,$gt,$gte(=,<,<=,>,>=) ,$ne(<>),$in ,$nin,$or,$not,$mod(取模),$exits,$where

// 操作符编写条件

db.php333.remove({num:204});

db.php333.remove({num:{'$lte':208}});

叮嘱:在执行 remove()函数之前,建议使用 find()命令判断执行的条件是否正确,

这是一个比较好的习惯。

命令:db.集合名.remove({})  可以实现清空集合的目的

db.php333.find({num:{'$lte':230}});        // 带条件查询

  1. 更新文档

方法一:直接修改

语法:db.集合名.update({条件},{新的文档})

db.php333.update({num:214},{num:1114444});

注意:出现的问题,符合条件的数据有多条,但是修改更新只更新第一条文档记录,并且新文档不修改的键值没有了。

方法二:使用修改器

$inc :加一个数字(针对的修改的原值是数字)

$set :修改某一个字段,如果该字段不存在,则新增该字段

修改一条语句:

语法: db.集合名.update({条件},{修改器名称:{修改的键:修改的新值}})

db.php333.update({num:211},{$inc:{num:3}});

修改多条语句:

    语法: db.集合名.update({条件},{$set:{新文档}},是否新增,是否修改多条)

是否新增:如果值是1(true),则没有满足条件时新增添加一个全新的文档

是否修改多条:如果值是1 (true),如果满足条件有多个文档,则都要修改

db.php.update({age:"8"},{$set:{name:"露露"}},true,true);

db.php.update({age:"8"},{$set:{name:"露露112"}},true,false);

db.php.find({age:"8"});

小结:如果文档只有一个键,并且一次只修改一个文档记录,并且修改的就是原键的值,使用方法一完全ok

如果要实现批量修改,并且有多个键,对不修改的键没有影响,就使用方法二,并且要加参数。

  1. 查询文档

语法:db.集合名.find({条件})

操作符使用频率最高的:

大于:  $gt          >

大于等于: $gte          >=

小于: $lt       <

小于等于:$lte   <=

等于  equal   =   $eq

不等于  not equal   !=  <>    $ne

实例1: 查询集合中第一个文档

db.php.findOne();

实例2:查询集合中某一个键等于**值的文档信息

db.php.find({age:"28"});

db.php.find({age:{'$eq':"28"}});

实例3:查询集合中大于某一个值的文档信息

db.php.find({age:{'$gt':"28"}});

实例4:查询集合中大于某一个值,小于某个值,即范围内文档信息

相当于mysql 中:select * from php333 where num>221 and num<249;

db.php333.find({num:{'$lt':249,'$gt':221}});

// 值是否需要加引号,要根据插入文档时的数据类型决定,要和插入文档时数据类型保持一致,数值类型不加引号,字符类型必须加引号。

实例5:只显示某一个键值信息或者不显示这个键值信息

db.php.find({},{name:1}) ;  // 只查询显示 name 键及对应的值信息

db.php.find({},{name:0}) ;  // 表示除了name 键值以外不显示,其它的都显示

实例6:显示集合中前几个文档,比如查询显示前3个文档

db.php333.find().limit(3);

实例6:查询显示集合中第3个文档到第5个文档

db.php333.find().skip(2).limit(3);

实例7:统计集合中文档的个数

db.集合名.count()   // 返回集合中有多少文档个数

db.php.count();

实例8:模糊查询

//查询name中包含“露”的文档信息

db.php.find({name:/露/});

// 查询以“露”开头的文档

db.php.find({name:/^露/});

// 查询以“露”结尾的文档

db.php.find({name:/露$/});

  1. mongodb 中 limit 与 skip 方法
  1. limint() 方法

在mongodb 中想要读取指定数量的文档数据记录,可以使用 limit() 方法,它接收一个数字参数,表示从集合中读取对应的记录文档数。

db.php333.find().limit(3);

db.php.find({name:/露$/}).limit(4);

db.php.find({name:/露$/}).limit();

// 没有指定limit 的参数,返回的是满足查询条件的所有文档记录

  1. skip() 方法

在mongodb中用来跳过指定数量的数据,同样也是接收一个数字参数,表示跳过的

记录数。

db.集合名.find({条件}).limit().skip()

db.php.find({name:/露$/}).limit(1).skip(1);

// 表示返回满足条件的查询结果1条记录,跳过1条,只显示的是第二条文档记录

备注:skip() 方法 默认参数值为0,可以省略。

  1. 查询排序

在mongodb 中使用 sort() 方法对进行排序,sort()方法可以通过参数指定排序的字段,并且使用  1 或者 -1 来指定排序的方式, 其中 1 为升序排序, 而 –1 为降序排序。

db.集合名.find().sort({键名:排序方式})

db.php222.find({age:{'$lt':58}}).sort({age:1})

db.php222.find({age:{'$lt':58}}).sort({age:-1})

备注:skip() 、limit()、sort() 三个放在一起执行的时候,执行的顺序是先 sort(), 然后是skip(),最后是显示 limit()。

Mongodb(学习总结)相关推荐

  1. MongoDB学习笔记(入门)

    MongoDB学习笔记(入门) 一.文档的注意事项: 1.  键值对是有序的,如:{ "name" : "stephen", "genda" ...

  2. MongoDB学习第一篇 --- Mac下使用HomeBrew安装MongoDB

    2019独角兽企业重金招聘Python工程师标准>>> MongoDB学习第一篇 --- Mac下使用HomeBrew安装MongoDB 0.确保mac已经安装了HomeBrew ( ...

  3. MongoDB学习札记第六篇之主从复制

    mongo系列文章请看http://www.codefrom.com/p/mongodb 环境准备: ubuntu12.0.4 mongodb3.0.3 主从复制是MongoDB中最常见的复制方式.这 ...

  4. Mongodb学习(安装篇): 在centos下的安装

    安装篇 ###下载解压文件 [root@192 lamp]# wget http://fastdl.mongodb.org/linux/mongodb-linux-i686- 2.2.2.tgz ## ...

  5. MongoDB学习笔记【2】-- 试用

    大部分内容根据MongoDB官方手册整理:http://docs.mongodb.org/manual/contents/ 查看数据库 [root@slayer ~]# mongo MongoDB s ...

  6. MongoDB学习笔记(四)使用Java进行实时监控与数据收集(空间使用量、连接数)

    目录: MongoDB学习笔记(一)环境搭建与常用操作 MongoDB学习笔记(二)使用Java操作MongoDB MongoDB学习笔记(三)使用Spring Data操作MongoDB Mongo ...

  7. MongoDB学习路线

    转载博客: 1.MongoDB学习笔记(一)MongoDB概述和安装 http://www.cnblogs.com/wupeiqi/archive/2013/05/12/3074478.html 2. ...

  8. MongoDB学习笔记(一) MongoDB介绍及安装

    系列目录 MongoDB学习笔记(一) MongoDB介绍及安装     MongoDB学习笔记(二) 通过samus驱动实现基本数据操作     MongoDB学习笔记(三) 在MVC模式下通过Jq ...

  9. PHP操作MongoDB学习笔记

    PHP操作MongoDB技術總結 <?php /** * PHP操作MongoDB学习笔记 */ //************************* //**   连接MongoDB数据库  ...

  10. MongoDB学习笔记(四)--索引 性能优化

    索引                                                                                             基础索引 ...

最新文章

  1. 刚刚,谷歌终于回应AI专利争议:怕被碰瓷,抢先下手,永不牟利
  2. GetLastError编号解释
  3. 基于数据挖掘的旅游推荐APP(一):开篇
  4. linux设置NO_PROXY绕过代理
  5. 利用mysql提供的c语言接口操作数据库
  6. phpmyadmin登陆错误:The requested URL /phpmyadmin was not found on this serve
  7. html中文本格式化、预格式化、计算机输出标签、address、title、文字方向、著作
  8. 国防现代化的数据_Linux容器如何解决国防虚拟化问题
  9. 为什么建议使用count(*)来统计数据行数
  10. 1、Redhat GNOME安装访问命令行
  11. 9.Kong入门与实战 基于Nginx和OpenResty的云原生微服务网关 --- 高级进阶
  12. SpringBoot如何实现自动配置
  13. 小程序入口构造工具二维码测试工具
  14. 顶级白嫖!!!八个python免费自学网站一周搞定python(抓紧收藏)
  15. java简单人物介绍
  16. 为什么敲了许多年的代码,却仍然在原地踏步?| 程序员有话说
  17. 每周分享第 29 期
  18. 根据文件路径区分文件的所属类型,并返回对应类型的文件路径
  19. OpenCV 4.5.1 - 新版本 中 BEBLID 描述符尝鲜 (基于 ubuntu / c++)
  20. 为Android Studio配置JDK1.8

热门文章

  1. 学号,课程名查询成绩
  2. 【C++】---日期计算器
  3. 【oracle11g,11】redo日志文件2 :日志恢复 (重点)
  4. 同学早已年薪百万 为何你却还在朋友圈集赞?
  5. 扒一扒那些叫欧拉的定理们(三)——简单多面体欧拉定理的抽象形式
  6. QQ机器人-nonebot
  7. 反欺诈之路——黑卡、养卡的识别
  8. dspq值多少最好_抖音手机上怎么修改视频的md5值
  9. 经典智力题:工人分金条问题
  10. 小几届的学弟问我,软件测试岗是选11k的华为还是20k的小公司,我直呼受不了,太凡尔赛了