Mongodb使用教程

6,084 阅读3分钟

本文已参与「掘力星计划」

MongoDB是一个基于分布式文件存储的数据库。还是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。 MongoDB是“面向集合”(Collection-Oriented),意思是数据被分组存储在数据集中,被称为一个集合(Collection)。每个集合在数据库中都有一个唯一的标识名,并且可以包含无限数目的文档。集合的概念类似关系型数据库(RDBMS)里的表(table),不同的是它不需要定义任何模式(schema)。Nytro MegaRAID技术中的闪存高速缓存算法,能够快速识别数据库内大数据集中的热数据,提供一致的性能改进。

  • 安装MongoDB[YUM|二进制]
[root@master ~]# cat /etc/yum.repo.d/mongodb-enterprise.repo
[mongodb-enterprise]name=MongoDB Enterprise Repository
baseurl=https://repo.mongodb.com/yum/redhat/$releasever/mongodb-enterprise/3.2/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-3.2.asc
[root@master ~]# yum -y install mongodb-enterprise*
[root@master ~]# service mongod start
[root@master ~]# chkconfig mongod on
[root@master ~]# wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-3.2.9.tgz
[root@master ~]# tar xf mongodb-linux-x86_64-rhel70-3.2.9.tgz -C /usr/local/mongodb
[root@master ~]# echo "export PATH=/usr/local/mongodb/bin:$PATH"
[root@master ~]# source /etc/profile
[root@master ~]# mkdir /usr/local/mongodb/data/
[root@master ~]# mongod -dpath='/usr/local/mongodb/data' >>/dev/null &
  • 创建数据库
[root@master ~]# mongo
MongoDB shell version: 3.2.9
connecting to: test
2016-09-22T14:14:53.370+0800 I NETWORK  [initandlisten] connection accepted from 127.0.0.1:33408 #9 (1 connection now open)
Server has startup warnings:
2016-09-22T13:35:03.540+0800 I CONTROL  [initandlisten] ** WARNING: You are running this process as the root user, which is not recommended.
2016-09-22T13:35:03.540+0800 I CONTROL  [initandlisten]
2016-09-22T13:35:03.540+0800 I CONTROL  [initandlisten]
2016-09-22T13:35:03.540+0800 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'.
2016-09-22T13:35:03.540+0800 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
2016-09-22T13:35:03.540+0800 I CONTROL  [initandlisten] 
> use password    #刚创建的数据库不在列表中中,如果要显示出来需要插入一些数据
> db.pass.insert({"ICBC":"111123"."ABC":"2345"})
> db.pass.insert("zhaopin":"zhilian")

这里的db.pass.insert是一个集合,比行的功能要多很多,创建了数据库是不会在列表中显示出来的,如果要显示出来需要插入一些数据到集合中

  • 插入文档
> use password    #使用数据库,如果不存在则创建这个数据库
switched to db password
> db.pass.insert({"name":"ICBC","pass":"123456"})  #向pass这个集合名称插入数据,这个集合名称存在的话插入文档,不存在则创建并插入文档,使用insert() 或 save()方法向集合中插入文档WriteResult({ "nInserted" : 1 })
> db.pass.insert({"name":"ICBC"})WriteResult({ "nInserted" : 1 })
> db.pass.find()  #查看集合中的数据
{ "_id" : ObjectId("57e37225ee48652129f301e6"), "name" : "ICBC", "pass" : "123456" }
{ "_id" : ObjectId("57e37232ee48652129f301e7"), "name" : "ICBC" }
  • 更新文档,格式如下:
db.collection.update(
    <query>,   #update的查询条件,类似sql update查询内where后面的。
    <update>,  #update的对象和一些更新的操作符(如$,$inc...)等,也可以理解为sql update查询内set后面的
    {
        upsert: <boolean>,  #可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入
        multi: <boolean>,  #可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
        writeConcern: <document>  #可选,抛出异常的级别。   
    }
)

> db.pass.insert({"name":"工商银行","address":"北沙滩桥东"})  #插入一条新的数据用来更新
WriteResult({ "nInserted" : 1 })
> db.pass.find().pretty()
{
    "_id" : ObjectId("57e38cbe66ee4124c4d93b6b"),
    "name" : "工商银行",
    "address" : "北沙滩桥东"
}
> db.pass.update({'name':'工商银行'},{$set:{'name':"农业银行"}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.pass.find().pretty()
{
    "_id" : ObjectId("57e38cbe66ee4124c4d93b6b"),	
    "name" : "农业银行",    #原来的工商银行已经改成了农业银行
    "address" : "北沙滩桥东"
}
  • 删除文档
db.collection.remove(
    <query>,   #(可选)删除的文档的条件。
    {
        justOne: <boolean>,   #(可选)如果设为 true 或 1,则只删除一个文档。
        writeConcern: <document>  #(可选)抛出异常的级别。   
    }
)

> db.pass.find()
{
 "_id" : ObjectId("57e37225ee48652129f301e6"),
 "pass" : "123456"
}
{ "_id" : ObjectId("57e37232ee48652129f301e7"),
"name" : "中国银行"
}
> db.pass.remove({'name':"中国银行"})   #删除一个文档
WriteResult({ "nRemoved" : 1 })
> db.pass.find(){
"_id" : ObjectId("57e37225ee48652129f301e6"),
"pass" : "123456"
}
  • 查询文档
> db.pass.find().pretty()  #以易读的方式来读取数据
{
    "_id" : ObjectId("57e37225ee48652129f301e6"),
    "pass" : "123456"
}
{
    "_id" : ObjectId("57e37232ee48652129f301e7"),
    "name" : "中国银行"
}
{
	"_id" : ObjectId("57e38cbe66ee4124c4d93b6b"),	
	"name" : "农业银行",
	"address" : "北沙滩桥东"
}
-----------------------------------------------
> db.pass.find().pretty()  #以非结构化的方式显示所有文档
{ "_id" : ObjectId("57e37225ee48652129f301e6"), "pass" : "123456" }
{ "_id" : ObjectId("57e37232ee48652129f301e7"), "name" : "中国银行" }
{ "_id" : ObjectId("57e38cbe66ee4124c4d93b6b"), "name" : "农业银行", "address" : "北沙滩桥东"}
  • mongodb开机启动脚本
#!/bin/bash
#chkconfig:2345 25 25
#Description:This file is for mongodb
basedir=/usr/local/mongodb-3.2.10
binsdir=$basedir/bin
datadir=$basedir/data
logsdir=$basedir/syslog
name=mongod
checkpid(){
	pid=`pgrep mongod`
}

echologs(){
	ps=`pgrep $name`
	if [[ -z $ps ]];then
		echo "Failed!!! $@"
	else
	   echo "Success!!! $@"
	fi
}
start(){
	checkpid
	if [[ $pid == "" ]];then
	   $binsdir/$name --logpath $logsdir/sys.log --dbpath $datadir --fork 2>&1 >>/dev/null		echologs
	else
		echo "Mongodb has already in running, pid is $pid"
	fi
}
stop(){
	checkpid
	if [ ! -z $pid ];then
		$binsdir/$name --shutdown --dbpath $datadir 2>1 >>/dev/null
		[[ -z $(`pgrep $name`) ]] && echo "Success!!! $@" || echo "Failed!!!"
	else
		echo "Mongodb not running. $@ "
	fi
}

status(){
    checkpid
    if [ ! -z $pid ];then
        echo "Mongodb is running, pid is $pid."
    else
        echo "Mongodb is not running."
    fi
}

case $1 in
	start)
	   start ;;
	stop)
	   stop ;;
	restart)
		stop
		start ;;
	status)
		status 	;;
	*)
		echo "Usage: $0 {start | stop | restart | status}"
				exit 0	;;
esac
exit 0