mongodb 基本介绍 安装和基本操作,最基础版本

一、MongoDB 介绍

1、MongoDB概述

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

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

它支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。

MongoDB服务端可运行在Linux、Windows平台,支持32位和64位应用,默认端口为27017。

推荐运行在64位平台,因为MongoDB在32位模式运行时支持的最大文件尺寸为2GB。

  1.  MongoDB的特点和优势

1)灵活的数据模型:MongoDB不需要事先定义表格结构,可以存储各种类型的数据,支持嵌入式文档和引用两种数据关联方式。

2)强大的查询语言:MongoDB提供丰富的查询操作符和聚合管道功能,支持复杂的查询和分析需求。

3)高性能的数据读写:MongoDB使用内存映射文件和预分配空间等技术优化数据读写性能,支持快速的插入、更新和查询操作。

4)可扩展的存储和计算能力:MongoDB支持水平扩展和自动分片,可以方便地增加服务器和处理大规模数据。

5)丰富的工具和生态系统:MongoDB提供了命令行工具和图形界面管理工具,还有众多的第三方库和框架支持。

  1. MongoDB与传统数据库的对比

SQL术语/概念

MongoDB术语/概念

解释说明

database

database

数据库

table

collection

数据库表\集合

row

document

行\文档

colum

field

数据字段\域

index

index

索引

table joins

表连接\MongoDB没有表连接

primary key

primary key

主键\MongoDB自动将_id字段设置主键

  1. MongoDB 主要特点
4.1、文档

MongoDB中的记录是一个文档,它是由字段和值对组成的数据结构。
多个键及其关联的值有序地放在一起就构成了文档。
MongoDB文档类似于JSON对象。字段的值可以包括其他文档,数组和文档数组。

{“greeting”:“hello,world”}这个文档只有一个键“greeting”,对应的值为“hello,world”。多数情况下,文档比这个更复杂,它包含多个键/值对。

例如:{“greeting”:“hello,world”,“foo”: 3} 文档中的键/值对是有序的,下面的文档与上面的文档是完全不同的两个文档。{“foo”: 3 ,“greeting”:“hello,world”}

文档中的值不仅可以是双引号中的字符串,也可以是其他的数据类型,例如,整型、布尔型等,也可以是另外一个文档,即文档可以嵌套。文档中的键类型只能是字符串。

使用文档的优点是:

  1. 文档(即对象)对应于许多编程语言中的本机数据类型
  2. 嵌入式文档和数组减少了对昂贵连接的需求
  3. 动态模式支持流畅的多态性

4.2、集合

集合就是一组文档,类似于关系数据库中的表。

集合是无模式的,集合中的文档可以是各式各样的。例如,{“hello,word”:“Mike”}和{“foo”: 3},它们的键不同,值的类型也不同,但是它们可以存放在同一个集合中,也就是不同模式的文档都可以放在同一个集合中。

既然集合中可以存放任何类型的文档,那么为什么还需要使用多个集合?

这是因为所有文档都放在同一个集合中,无论对于开发者还是管理员,都很难对集合进行管理,而且这种情形下,对集合的查询等操作效率都不高。所以在实际使用中,往往将文档分类存放在不同的集合中。

例如,对于网站的日志记录,可以根据日志的级别进行存储,Info级别日志存放在Info 集合中,Debug 级别日志存放在Debug 集合中,这样既方便了管理,也提供了查询性能。

但是需要注意的是,这种对文档进行划分来分别存储并不是MongoDB 的强制要求,用户可以灵活选择。

可以使用“.”按照命名空间将集合划分为子集合。

例如,对于一个博客系统,可能包括blog.user 和blog.article 两个子集合,这样划分只是让组织结构更好一些,blog 集合和blog.user、blog.article 没有任何关系。虽然子集合没有任何特殊的地方,但是使用子集合组织数据结构清晰,这也是MongoDB 推荐的方法。

4.3、数据库

MongoDB 中多个文档组成集合,多个集合组成数据库。

一个MongoDB 实例可以承载多个数据库。它们之间可以看作相互独立,每个数据库都有独立的权限控制。在磁盘上,不同的数据库存放在不同的文件中。

MongoDB 中存在以下系统数据库。

Admin 数据库:一个权限数据库,如果创建用户的时候将该用户添加到admin 数据库中,那么该用户就自动继承了所有数据库的权限。

Local 数据库:这个数据库永远不会被复制,可以用来存储本地单台服务器的任意集合。

Config 数据库:当MongoDB 使用分片模式时,config 数据库在内部使用,用于保存分片的信息。

4.4、数据模型

一个MongoDB 实例可以包含一组数据库,一个DataBase 可以包含一组Collection(集合),一个集合可以包含一组Document(文档)。

一个Document包含一组field(字段),每一个字段都是一个key/value pair

  1. key: 必须为字符串类型
  2. value:可以包含如下类型
  1. 基本类型,例如,string,int,float,timestamp,binary 等类型
  2. 一个document
  3. 数组类型

二、Linux安装MongoDB

1、下载MongoDB安装包

[root@ligc_31 ~]# wget  https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-4.2.1.tgz

2、解压安装
2.1、解压

[root@ligc_31 ~]# tar -zxvf mongodb-linux-x86_64-rhel70-4.2.1.tgz -C /one

2.2、创建 MongoDB 必要目录

[root@ligc_31 ~]# mkdir -p /usr/local/mongodb/{data,logs} #日志文件目录 和数据文件存放目录

[root@ligc_31~]# touch  /usr/local/mongodb/logs/mongodb.log #日志文件mongodb.log

3、 配置path环境变量,确保mongodb的bin目录包含在path环境变量中。

[root@ligc_31 ~]# vim /etc/profile

找到export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE HISTCONTROL,在这行上面添加以下内容:

#set for mongodbexport

export MONGODB_HOME=/opt/mongodbexport

export PATH=$MONGODB_HOME/bin:$PATH

保存退出

输入 重新加载变量

[root@ligc_31 ~]# source /etc/profile

[root@ligc_31 ~]# echo $PATH

4、移动 MongoDB 安装目录/usr/local/mongo目录下,创建目录

[root@ligc_31 one]# mv mongodb-linux-x86_64-rhel70-4.2.1/*  /usr/local/mongodb

5、添加 MongoDB 配置文件

[root@ligc_31 ~]# vim /etc/mongodb.conf

书写内容如下

#数据保存路径

#指定数据库路径

dbpath=/usr/local/mongodb/data

#指定MongoDB日志文件

logpath=/usr/local/mongodb/logs/mongodb.log

# 使用追加的方式写日志

logappend=true

#端口号

port=27017

#方便外网访问,外网所有ip都可以访问,不要写成固定的linux的ip

bind_ip=0.0.0.0

fork=true # 以守护进程的方式运行MongoDB,创建服务器进程

auth=true #启用用户验证

#bind_ip=0.0.0.0 #绑定服务IP,若绑定127.0.0.1,则只能本机访问,不指定则默认本地所有IP

6、启动和关闭 MongoDB

[root@ligc_31 ~]#/usr/local/mongodb/bin/mongod -f  /etc/mongodb.conf

查看进程

[root@ligc_31 ~]#ps -ef | grep mongod

关闭 MongoDB(-conf 使用配置文件方式关闭 )

[root@ligc_31 ~]#/usr/local/mongodb/bin/mongod --shutdown -f /etc/mongodb.conf

启动报错的解决:

报错一:ERROR: child process failed, exited with error number 48

解决方案:通过mongod --repair检查具体错误。

原来是端口冲突。删除前面没执行成功的文件,然后修改XXX.conf配置文件。将其中端口号改为27016后。重新执行后成功。

如果启动后没有关闭,再起启动也会报错48.则可以先使用关闭命令关闭,然后再次启动。

报错二:-bash: /usr/local/mongodb6/bin/mongod: Permission denied

启动的时候报错了,是因为没权限访问该文件

解决方案:给mongodb文件夹分配最高权限

sudo chmod -R 777 /usr/local/mongodb

-R 是指级联应用到目录里的所有子目录和文件

777 是所有用户拥有的最高权限

7、创建软连接

[root@ligc_31 ~]# ln -s /usr/local/mongodb/bin/*  /usr/local/bin

8、增加mongodb用户及设置权限

[root@ligc_31 ~]#  useradd mongodb -M -s /sbin/nologin

[root@ligc_31 ~]#  chown -R mongodb.mongodb /data/mongodb

9、设置开机自启

1)首先添加MongoDB系统服务,命令如下:

vim /etc/rc.d/init.d/mongod

2)打开编辑器后,我们将下面的配置粘贴进去,然后保存

start() {

/usr/local/mongodb/bin/mongod --config /etc/mongodb.conf

}

stop() {

/usr/local/mongodb/bin/mongod --config /etc/mongodb.conf --shutdown

}

case "$1" in

start)

start

;;

stop)

stop

;;

restart)

stop

start

;;

*)

echo

$"Usage: $0 {start|stop|restart}"

exit 1

esac

  1. 保存完成之后,添加脚本执行权限,命令如下:

[root@ligc_31 ~]# chmod +x /etc/rc.d/init.d/mongod

  1. 启动MongoDB,service mongod start 如下图所示,则说明启动成功:

三、MongoDB基本操作及增删改查

1、第一次无密码登录mongo

mongodb安装好后第一次进入是不需要密码的,也没有任何用户,通过shell   mongo命令 可直接进入

show dbs   --查看所有的库,默认只有local admin config

use admin  --切换到admin库,创建系统管理员

创建用户格式

 use [数据库名];

db.createUser(

   {

      user: "[用户名]",

      pwd: "[密码]",

      roles: [ {

       role: "[user角色类型]",

       db: "[数据库名]" }

      ]

   }

)

user角色类型:

1)数据库用户角色:

read:授予用户读取指定数据库的权限。

readWrite:授予用户读取和写入指定数据库的权限。

2)数据库管理角色:

dbAdmin:授予用户在当前数据库中执行管理操作的权限,如索引管理、数据库统计信息查看等。

dbOwner:授予用户在当前数据库上执行所有操作的权限,包括读写数据和执行管理任务。

userAdmin:授予用户在当前数据库上管理用户和角色的权限,包括创建、修改和删除用户和角色。

3)集群管理角色:

clusterAdmin:授予用户管理整个MongoDB集群的权限,包括添加和删除节点、更改复制集配置等。

clusterManager:授予用户管理和监控集群的权限,但不包括更改集群配置的权限。

clusterMonitor:授予用户仅监控集群的权限,包括对集群状态的读取访问。

hostManager:授予用户监控和管理服务器的权限,包括查看服务器状态和执行一些管理操作。

4)备份恢复角色:

backup:授予用户备份数据的最小权限,通常与其他角色结合使用以完成备份任务。

restore:授予用户恢复数据的权限,允许用户从备份中恢复数据。

5)所有数据库角色:

readAnyDatabase:授予用户读取所有数据库的权限。

readWriteAnyDatabase:授予用户读取和写入所有数据库的权限。

userAdminAnyDatabase:授予用户在所有数据库上管理用户和角色的权限。

dbAdminAnyDatabase:授予用户在所有数据库上执行管理操作的权限。

6)超级用户角色:

root:授予用户在系统上执行任何操作的权限,包括访问任何数据库、执行任何操作和管理其他用户等。这是一个非常强大的角色,应谨慎分配。    // 这里还有几个角色间接或直接提供了系统超级用户的访问(dbOwner 、userAdmin、userAdminAnyDatabase)

7.)内部角色:__system

备注:删除用户命令 db.dropUser("userName")

2、登录数据库

命令

[root@ligc_31 ~]# mongo

3、创建用户
  1. 创建用户admin

> use admin  #选择数据库

>db.createUser({user:"admin",pwd:"root@123",roles:[{role:"dbAdminAnyDatabase",db:"admin"},{role:"userAdminAnyDatabase",db:"admin"}]})

  1. 创建超级用户root

> use admin  #选择数据库

>db.createUser({user:"root",pwd:"root@123",roles:[{role:"dbAdminAnyDatabase",db:"admin"},{role:"userAdminAnyDatabase",db:"admin"},{role:"dbOwner",db:"admin"}]})

4、基本操作
  1. 查看数据库

>show databases;

  1. 选择数据库

> use 数据库名

如果切换到一个没有的数据库,例如use admin2,那么会隐式创建这个数据库。(后期当该数据库有数据时,系统自动创建) 但show databases;

查看不到

  1. 查看集合

> show collections

  1. 创建集合

>db.createCollection('集合名')

  1. 删除集合

>db.集合名.drop()

5、集合增删改查
5.1、增加

>db.集合名.insert(JSON数据)

如果集合存在,那么直接插入数据。如果集合不存在,那么会隐式创建。

示例:在test2数据库的c1集合中插入数据(姓名叫webopenfather年龄18岁)

>use test2 db.c1.insert({uname:"webopenfather",age:18})

  1. 数据库和集合不存在都隐式创建
  2. 对象的键统一不加引号(方便看),但是查看集合数据时系统会自动加
  3. mongodb会给每条数据增加一个全球唯一的_id键

  1. _id键的组成

  1. 自己增加_id

可以,只需要给插入的JSON数据增加_id键即可覆盖(但实战强烈不推荐)

>db.c1.insert({_id:1, uname:"webopenfather", age:18})

5.2、一次性插入多条数据

传递数据,数组中写一个个JSON数据即可

>db.c1.insert([  {uname:"z3", age:3},  {uname:"z4", age:4},    {uname:"w5", age:5} ])

5.3、快速插入10条数据

由于mongodb底层使用JS引擎实现的,所以支持部分js语法。因此:可以写for循环

>for (var i=1; i<=10; i++) {     db.c2.insert({uanme: "a"+i, age: i}) }

5.4、查询文档

>db.集合名.find(条件[,查询的列])

条件

写法

查询所有的数据

{}或者不写

查询age=6的数据

{age:6}

既要age=6又要性别=男

{age:6,sex:‘男’}

查询的列(可选参数)

写法

查询全部列(字段)

不写

只显示age列(字段)

{age:1}

除了age列(字段)都显示

{age:0}

其他语法

db.集合名.find({ 键:{运算符:值} })

运算符

作用

$gt

大于

$gte

大于等于

$lt

小于

$lte

小于等于

$ne

不等于

$in

in

$nin

not in

实例练习

查询所有数据

1)查询age大于5的数据

db.c1.find({age:{$gt:5}})

2)查询年龄是5岁、8岁、10岁的数据

db.c2.find({age:{$in:[5,8,10]}})

3)只看年龄列,或者年龄以外的列

db.c2.find({},{age:1}) 只看年龄列

db.c2.find({},{age:0}) 年龄以外的列

5.5、修改文档

db.集合名.update(条件,新数据[是否新增,是否修改多条,])

  1. 新数据此数据需要使用修改器,如果不使用,那么会将新数据替换原来的数据。1db.集合名.update(条件,{修改器:{键:值}}[是否新增,是否修改多条,])

修改器作用inc递增rename重命名列set修改列值unset删除列

  1. 是否新增

指条件匹配不到数据则插入(true是插入,false否不插入默认)

db.c3.update({uname:"zs30"},{$set:{age:30}},true)

是否修改多条
指将匹配成功的数据都修改(true是,false否默认)
>db.c3.update({uname:"zs2"},{$set:{age:30}},false,true)

实例练习
准备工作

use test2;

for(var i = 1; i<= 10; i++){

db.c3.insert( {"uname":"zs"+i,"age":i} );

}

  1. 将{uname:"zs1"}改为{uname:"zs2"}

db.c3.update({uname:"zs1"},{$set:{uname:"zs2"}})

  1. 给{uname:"zs10"}的年龄加2岁或减2岁

db.c3.update({uname:"zs10"},{$inc:{age:2}})

递减只需要将2改为-2即可。

综合练习插入数据:

db.c4.insert( {uname:"神龙教主",age:888,who:"男",other:"非国人"});

5.6、删除文档

db.集合名.remove(条件[,是否删除一条])

1)是否删除一条

true:是(删除的数据为第一条)

false:否

2)db.c3.remove({uname:"zs3"}) #删除具体

5.7、总结

MongoDB删除语法:remove

增Create

db.集合名.insert(JSON数据)

删Delete

db.集合名.remove(条件 [,是否删除一条true是false否默认])

也就是默认删除多条

改Update

db.集合名.update(条件, 新数据  [,是否新增,是否修改多条])

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

查Read

db.集合名.find(条件 [,查询的列])

四、MongoDB存储数据类型

1、数字

shell默认使用64位浮点型数值

db.sang_collec.insert({x:3.1415926})

db.sang_collec.insert({x:3})

2、字符串

字符串也可以直接存储,如下:

db.sang_collec.insert({x:"hello MongoDB!"})

3、正则表达式

正则表达式主要用在查询里边,查询时我们可以使用正则表达式,语法和JavaScript中正则表达式的语法相同,比如查询所有key为x,value以hello开始的文档且不区分大小写:

db.sang_collec.find({x:/^(hello)(.[a-zA-Z0-9])+/i})

4、数组

数组一样也是被支持的,如下:

db.sang_collec.insert({x:[1,2,3,4,new Date()]})

五、MongoDB 中的索引

1、索引创建

默认情况下,集合中的_id字段就是索引,我们可以通过getIndexes()方法来查看一个集合中的索引:

db.集合名.getIndexes()

索引建立方式如下:

db.集合名.ensureIndex({x:1})

1表示升序,-1表示降序。当我们给x字段建立索引之后,再根据x字段去查询,速度就非常快了,

每个索引都有一个名字,默认的索引名字为字段名_排序值,当然我们也可以在创建索引时自定义索引名字,如下:

db.集合名.ensureIndex({x:1},{name:"myfirstindex"})

当然索引在创建的过程中还有许多其他可选参数,如下

db..集合名.ensureIndex({x:1},{name:"myfirstindex",dropDups:true,
background:true,unique:true,sparse:true,v:1,weights:99999})

1)name表示索引的名称

2dropDups表示创建唯一性索引时如果出现重复,则将重复的删除,只保留第一个

3background是否在后台创建索引,在后台创建索引不影响数据库当前的操作,默认为false

4unique是否创建唯一索引,默认false

5sparse对文档中不存在的字段是否不起用索引,默认false

6v表示索引的版本号,默认为2

7weights表示索引的权重

2、查看索引

getIndexes()可以用来查看索引,我们还可以通过totalIndexSize()来查看索引的大小,如下

db..集合名.totalIndexSize()

3、删除索引

1)我们可以按名称删除索引,如下:

db..集合名.dropIndex("xIndex")

表示删除一个名为xIndex的索引,当然我们也可以删除所有索引,如下

db.集合名.dropIndexes()

  • 17
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值