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》
2、 linux 下环境安装
详细内容参照操作说明手册
四、 入门语句
1、 创建数据库
语法: use 数据库名称
2、 查看数据库
语法:show dbs

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

Admin: 管理权限的,添加 root 用户,用来管理其他所有非root 用户的权限,有一些特定的服务器命令必须在admin 库下执行;
Local: 这个数据永远不会被赋值,可以用来存储限于本地单台服务器的任何集合;
Config:当mongodb 用于分片设置时,config 数据库在内部使用,用于保存分片信息。
3、 创建集合
注意: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

5、 查看集合中的文档
语法: 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();

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

db.php22.find();

db.php.find();

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

db.php222.remove({}); // 表示删除集合中所有的数据
常见的操作符:

l t , lt, lt,lte, g t , gt, gt,gte(<,<=,>,>=) , n e ( < > ) , ne(<>), ne(<>),in , n i n , nin, nin,or, n o t , not, not,mod(取模), e x i t s , exits, exits,where

// 操作符编写条件

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

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

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

这是一个比较好的习惯。

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

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

3、 更新文档
方法一:直接修改
语法: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
如果要实现批量修改,并且有多个键,对不修改的键没有影响,就使用方法二,并且要加参数。

4、 查询文档
语法:db.集合名.find({条件})

操作符使用频率最高的:

大于: $gt >
大于等于: $gte >=
小于: l t < 小 于 等 于 : lt < 小于等于: 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:{‘ l t ′ : 249 , ′ lt':249,' 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:/露$/});

5、 mongodb 中 limit 与 skip 方法
(1) limint() 方法

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

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

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

db.php.find({name:/露$/}).limit();
// 没有指定limit 的参数,返回的是满足查询条件的所有文档记录

(2) skip() 方法
在mongodb中用来跳过指定数量的数据,同样也是接收一个数字参数,表示跳过的
记录数。

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

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

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

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

6、 查询排序
在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()。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值