MongoDB(一)

1.什么是MongoDB

为现代应用程序研发的数据库;
MongoDB是为现代应用程序开发人员和云时代构建的通用的、基于文档的分布式数据库。没有哪一个数据库能更有效地使用。

MongoDB属于NoSQL数据库中的一种,NoSQL = Not Only SQL ,意即"现代开发不仅仅局限于基于SQL的关系型数据库,还应该有一些别的数据库,比如非关系型的数据库",NoSQL数据库叫非关系型数据库;
MongoDB 使用C++开发;
MongoDB诞生于2007,2009年2月首度推出;
MongoDB现在分为企业版和社区版,社区版免费

在这里插入图片描述

2.MongoDB的下载

MongoDB现在已没有32位的安装包,所以要求电脑或服务器必须是64位的;
1、访问官方网站:https://www.mongodb.com 找到下载链接;
2、下载链接:https://www.mongodb.com/download-center/community

Linux:
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-4.2.0.tgz
windows: https://fastdl.mongodb.org/win32/mongodb-win32-x86_64-2012plus-4.2.0.zip

3.MongoDB的安装

1、解压:tar -zxvf mongodb-linux-x86_64-rhel70-4.2.0.tgz -C /usr/local/software
其中-C表示解压到一个指定的目录,解压后即可使用,无需其他操作;

2、在安装主目录下创建一个data目录,用于MongoDB存储数据;

3、MongoDB 在bin 目录下提供了一系列有用的工具(可执行程序);
mongo: 客户端命令行工具,其实也是一个js 解释器,支持js 语法;
mongod: 数据库服务端,每个实例启动一个进程,可以fork 为后台运行;
bsondump: 将bson 格式的文件转储为json 格式的数据;
mongodump/ mongorestore: 数据库备份和恢复工具;
mongoexport/ mongoimport: 数据导出和导入工具;
mongofiles: GridFS 管理工具,可实现二制文件的存取;
mongos: 分片路由,如果使用了sharding 功能,则应用程序需要连接mongos;

4.MongoDB的日常管理

1、启动MongoDB:
切换到安装目录的bin目录下:
./mongod --dbpath=/usr/local/mongodb-4.2.0/data/
其中 --dbpath是指定MongoDB数据存储的位置,如果不指定默认是/data/db/ 目录下;

2、允许远程连接访问:
MongoDB默认只能本机ip可以访问,其他机器的ip的不能访问,启动时使用
–bind_ip=0.0.0.0 参数指定不限制绑定的ip;

3、后台启动MongoDB:
./mongod --bind_ip=0.0.0.0 --dbpath=/usr/local/mongodb-4.2.0/data/ --logpath=/usr/local/mongodb-4.2.0/logs.log --logappend --fork
通过–fork参数表示后台启动,使用fork参数时,其中logpath参数不能少,这是强制的,logappend表示日志追加 (可以省略);
可以把上面的命令封装到一个Linux的shell脚本中,方便操作;

4、登录MongoDB命令行:
在MongoDB安装目录的bin目录下执行:
./mongo 进入mongodb的命令行,默认进入test数据库;
./mongo 127.0.0.1:27017 进入指定ip端口的mongodb命令行;
./mongo 127.0.0.1:27017/test 进入指定ip端口和数据库test的mongodb命令行;

5、日常操作命令:
查看有多少数据库:show dbs 或者 show databases;
目前处于哪个数据库:db;
当前库中有多少个集合(表):show collections;或者show tables;

6、关闭MongoDB服务:
方式一:

use admin;
db.shutdownServer();
方式二:
./mongod --shutdown --dbpath /usr/local/mongodb-4.2.0/data/
方式三:
kill pid进程号
方式四:
如果是前台启动,直接Ctrl+c停止;
其他常用命令:
./mongod --version
./mongod –help

6.MongoDB安全认证

1、绑定内网地址IP访问MongoDB 服务; --bind_ip 指定监听的ip

2、设置监听端口; 启动时指定 --port 端口号 (默认端口是27017)

3、使用用户名和口令登录; --auth 开启安全登录验证

每个MongoDB数据库可以多个用户,如果开启了安全登录检查,则只有数据库认证用户才能执行读或者写操作。
在admin数据库中创建登录认证用户;
use admin;
db.createUser({user:“root”, pwd:“123456”, roles:[{role:“dbAdminAnyDatabase”, db:“admin”}]});

重新启动数据库服务,并在启动时候,添加安全认证参数–auth:
mongod --dbpath /usr/local/mongodb-4.0.8/data --auth

添加了认证账号后的登录:
./mongo -u root -p 123456 也可以./mongo admin -u root -p 123456
其中admin是数据库名;

7.常见命令

创建数据库

use mydb;
此时还没有数据库,如果再创建了集合就会有数据库;
创建一个集合:

db.createCollection(“users”);

monggodb插入数据

db.users.insert({name:”zhangsan”, age : 100});
其中db是固定的,users是集合的名称,也可以理解为表;
查看db.xxxx 后面可以执行的操作:db.help();

创建集合有两种方式,显示创建和隐式创建
显示创建可以使用命令 db.createCollection(“集合名称")
隐式创建可以使用命令 db.集合名称.insert({}),指创建集合并同时向集合中插入数据,例如:db.customer.insert({name:“ll”});

向集合添加文档

使用命令 db.集合名称.insert({}),例如:
db.user1.insert({name:”jack”,age:20})
db.collection.insertOne():向指定集合中插入一条文档数据;
db.collection.insertMany():向指定集合中插入多条文档数据;
db.users.insertOne({name:‘张翠山’, age:32, address:‘冰火岛’});
db.users.insertMany([{name:‘张无忌’, age:21, address:‘灵蛇岛’}, {name:‘谢逊’, age:54, address:‘灵蛇岛’}]);

MongoDB 支持的数据类型中,_id 是其自有产物,存储在MongoDB 集合中的每个文档(document)都有一个默认的主键_id,这个主键名称是固定的,默认是ObjectId。在关系数据库设计中,主键大多是数值型的,比如常用的int 和long,并且更通常的是主键的取值由数据库自增获得,这种主键数值的有序性有时也表明了某种逻辑。而MongoDB,它在设计之初就定位于分布式存储系统,所以它原生的不支持自增主键。

删除集合中的文档

使用命令 db.集合名称.remove({删除条件}),不加删除条件为删除集合中的所有文档,例如,
db.c1.remove() 为删除c1集合中的所有文档;
db.users.remove({name: ‘张翠山’})
为删除c1集合中name 为 张翠山 的文档;

删除集合
db.customer.drop();
其中user_info是集合的名称;

删除当前数据库
使用命令 db.dropDatabase()

面向文档的NoSQL 数据库主要解决的问题不是高性能的并发读写,而是保证海量数据存储的同时,具有良好的查询性能。
MongoDB 最大的特点是他支持的查询语言非常强大,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。很多项目都考虑用MongoDB 来替代MySQL 等传统数据库来实现不是特别复杂的Web 应用。由于数据量实在太大,所以迁移到了MongoDB 上面,数据查询的速度得到了非常显著的提升。

查询集合中的文档
可以使用命令 db.集合名称.find({条件}),或者使用 db.集合名称.findOne() 查询第一个文档。
MongoDB查询还支持一些额外的参数选项:
db.users.find({}, {age:0}); --返回除age字段外的所有字段;
db.users.find({address: ‘灵蛇岛’},{_id:0}); --返回地址是’灵蛇岛’不返回_id字段;
db.users.find({address: ‘灵蛇岛’},{name:1}); --返回地址是’灵蛇岛’的name字段;
如果不明确指定,_id字段始终都会返回;
如果你需要以易读的方式来读取数据,可以使用 pretty() 方法,语法格式如下:
db.users.find({}).pretty()

查询集合中的文档 ,使用条件表达式(<, <=, >, >=, ==, !=)
//大于: field > value
db.collection.find({field:{KaTeX parse error: Expected 'EOF', got '}' at position 9: gt:value}̲}); db.users.fi…gt:10}});

//小于: field < value
db.collection.find({field:{KaTeX parse error: Expected 'EOF', got '}' at position 9: lt:value}̲}); //大于等于: fie…gte:value}});
//小于等于: field <= value
db.collection.find({field:{KaTeX parse error: Expected 'EOF', got '}' at position 10: lte:value}̲}); //等于:field=…ne:value}});

统计查询

统计(count)
db.collection.count();
db.collection.find().count();
db.collection.find({age:{$lt:5}}).count();

排序查询
db.users.find().sort({age:1}); 升序
db.users.find().sort({age:-1}); 降序

分页查询

分页(skip、limit、count)
db.users.find().skip(2).limit(3);
db.users.find().sort({age:-1}).skip(2).limit(3);
db.users.find().sort({age:-1}).skip(2).limit(3).count();
db.users.find().sort({age:-1}).skip(2).limit(3).count(0);
db.users.find().sort({age:-1}).skip(2).limit(3).count(1);

MongoDB查询and关系

MongoDB AND 条件
MongoDB 的 find() 方法可以传入多个键(key),每个键(key)以逗号隔开,即 SQL 的 AND 条件。
db.users.find({“name”:“张三”, “age”:98});

MongoDB查询or关系

查询集合中的文档 KaTeX parse error: Expected '}', got 'EOF' at end of input: …db.users.find({or:[{name:‘张三丰’},{age:21}]});
查询集合中的文档 KaTeX parse error: Expected '}', got 'EOF' at end of input: …db.users.find({nor:[{name:‘张三丰’},{age:21}]});

MongoDB查询包含关系

查询集合中的文档 KaTeX parse error: Expected '}', got 'EOF' at end of input: …nd({address : {all:[‘武当山’]} });

查询in关系

查询集合中的文档 , i n , 类 似 于 关 系 型 数 据 库 中 的 I N ; 查 询 集 合 中 的 文 档 , in,类似于关系型数据库中的IN; 查询集合中的文档 , inIN,nin,与KaTeX parse error: Expected '}', got 'EOF' at end of input: …s.find({age : {in:[21, 54, 100]} });

查询exist关系

查询集合中的文档 KaTeX parse error: Expected '}', got 'EOF' at end of input: …s.find({name: {exists:1}});
$exists:1表示真,指存在
$exists:0表示假,指不存在。

游标

查询集合中的文档 ,类似于关系型数据库,mongodb中也有游标的概念;
var allUsers = db.users.find();
allUsers.hasNext();
allUsers.count();
allUsers.next();

更新操作

更新集合中的文档,语法如下:
db.collection.update(criteria,objNew,upsert,multi)
参数说明:
criteria: update的查询条件,类似sql update查询内where后面的

objNew: 用于设置更新内容的对象

upsert: 如果记录已经存在,更新它,否则新增一个记录,取值为0或1

multi:如果有多个符合条件的记录,是否全部更新,取值为0或1
注意:默认情况下,只会更新第一个符合条件的记录;
db.users.update({age:99}, {$set: {age:999}}, 1, 1);
更新集合中的文档,使用 $inc 将集合中age为99的age加1,其它键不变, $inc表示使某个键值加减指定的数值;
更新集合中的文档, KaTeX parse error: Expected '}', got 'EOF' at end of input: …e({name:”张三”},{set:{address:”bj”}}, 0, 1)
将name为user1的文档修改address为tj,其它键值对不变,命令为:
db.c1.update({name:”user1”},{$set:{address:”tj”}},0,1)
更新集合中的文档, KaTeX parse error: Expected '}', got 'EOF' at end of input: …name:”user1”},{unset:{address:1}},0,1)

索引

索引就是用来加速查询的,数据库索引与书籍的目录类似,有了目录就不需要翻遍整本书,数据库通过索引查找,使得查找速度能提高几个数量级。在索引中找到条目以后,就可以直接跳转到目标文档的位置。
索引的相关命令:
创建普通索引:db.users.createIndex({key:1})
查看关于索引的相关信息:db.users.stats();
查看查询使用索引的情况:db.collection.find({key:value}).explain();
删除索引:db.collection.dropIndex({key:1});
删除集合(表),也会将集合中的索引全部删除
创建唯一索引:db.users.createIndex ({key:1},{unique:true});

固定集合

固定集合指的是事先创建而且大小固定的集合(表)。
如果空间不足,最早的文档就会被删除,为新的文档腾出空间。
固定集合适用于想要自动淘汰过期属性的场景。
创建固定集合使用命令:
db.createCollection(“sms”,{capped:true, size:100000, max:3});
capped选项为true,表示为固定集合;
size指定集合大小,单位为KB;
max指定文档的数量;
当指定文档数量上限时,必须同时指定大小,淘汰机制只有在容量还没有满时才会依据文档数量来工作,要是容量满了,淘汰机制会依据容量来工作。

8.MongoDB与Java客户端

MongoDB 提供了当前所有主流开发语言的数据库驱动包,支持Perl、PHP、Java、C#、JavaScript、Ruby、C 和C++语言的驱动程序,开发人员使用任何一种主流开发语言都可以轻松编程,实现对MongoDB 数据库的操作。

Java客户端依赖:

<!-- mongo-java-driver -->
<dependency>
    <groupId>org.mongodb</groupId>
    <artifactId>mongo-java-driver</artifactId>
    <version>3.11.0</version>
</dependency>

连接URL格式:
mongodb://[username:password@]host1[:port1][,host2[:port2],…[,hostN[:portN]]][/[database][?options]]
mongodb:// 这是固定的格式,必须要指定。
username:password@ 可选项,如果设置,在连接数据库服务器之后,驱动都会尝试登陆这个数据库;
host1 必须的指定至少一个host, host1 是这个URI唯一要填写的。它指定了要连接服务器的地址。如果要连接复制集,请指定多个主机地址。
portX 可选的指定端口,如果不填,默认为27017;

/database 如果指定username:password@,连接并验证登陆指定数据库。若不指定,默认打开 test 数据库。
?options 是连接选项。如果不使用/database,则前面需要加上/。所有连接选项都是键值对name=value,键值对之间通过&或;(分号)隔开;

9.Spring整合MongoDB

xmlns:mongo=“http://www.springframework.org/schema/data/mongo”

http://www.springframework.org/schema/data/mongo https://www.springframework.org/schema/data/mongo/spring-mongo.xsd

<mongo:mongo-client id=“mongo” host=“192.168.10.128” port=“27017” credentials=“root:123456@admin”/>

<mongo:db-factory id=“mongoDbFactory” mongo-ref=“mongo” dbname=“admin”/>

需要在工厂里面也指定一下数据库名称,否则默认是插入到名叫db的数据库;

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值