一. 基本概念:
MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。
MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。
二.MongoDB的安装
- 下载mongoDB
wget http://downloads.mongodb.org/linux/mongodb-linux-i686-2.4.9.tgz
如果上面地址不对可以去官网自己下载http://www.mongodb.org/downloads
解压mongoDB
tar zxvfmongodb-linux-i686-2.4.9.tgz
- 创建指定的文件夹中并将mongodb复制过去
mkdir -p/usr/local/mongodb
cp -Rmongodb-linux-i686-2.4.9/* /usr/local/mongodb/
- 创建数据库存放目录和日志存放文件
mkdir -p /data/mongo/data
touch /data/monogo/dblogs
- 启动mongod
/usr/local/mongodb/bin/mongod--dbpath=/data/mongo/data -- logpath=/data/mongo/dblogs --logappend --fork
//--fork 是为了让程序后台执行
- 设置开机自启动
echo /usr/local/mongodb/bin/mongod --dbpath=/data/mongo/data --logpath=/data/mongo/dblogs--logappend --fork >>/etc/rc.local
关闭mongod进程:pkill mongod
启动命令常用参数说明:
--dbpath 指定数据库文件存放的目录
--port
指定mongod服务使用的端口默认27017
--fork
设置mongo服务为后台运行
--logpath
指定log文件的目录和文件名
--logappend
设置每次log添加在文件最后
--journal
启用日志
--pidfilepath
指定进程文件的路径,如果不指定,系统将不产生进程
--maxConns
最大并发连接数
--noprealloc
关闭数据文件的预分配功能
--rest
关闭rest api功能
--nohttpinterface
关闭web管理功能
--auth
指定mongo使用身份验证机制
--bind_ip
绑定ip
三.MongoDB的重要知识点
启动MongoDB:/usr/share/mongodb/mongodb-linux-i686-2.4.9/bin/mongod --dbpath=/data/mongo/data --logpath=/data/mongo/dblogs --logappend --fork (fork:在后台运行)
MongoDB 的 Web 界面:http://localhost:28017/
"show dbs" 命令可以显示所有数据的列表
"db" 命令可以显示当前数据库
运行"use"命令,可以连接到一个指定的数据库
> use local
switched to db local
> db
local
SQL术语/概念 | MongoDB术语/概念 | 解释/说明 |
database | database | 数据库 |
table | collection | 数据库表/集合 |
row | document | 数据记录行/文档 |
column | field | 数据字段/域 |
index | index | 索引 |
table joins | 表连接,MongoDB不支持 | |
primary key | primary key | 主键,MongoDB自动将_id字段设置为主键 |
数据库名的命名规范:
数据库名可以是满足以下条件的任意UTF-8字符串。
- 不能是空字符串("")。
- 不得含有' '(空格)、.、$、/、\和\0 (空字符)。
- 应全部小写。
- 最多64字节。
有一些数据库名是保留的,可以直接访问这些有特殊作用的数据库。
- admin: 从权限的角度来看,这是"root"数据库。要是将一个用户添加到这个数据库,这个用户自动继承所有数据库的权限。一些特定的服务器端命令也只能从这个数据库运行,比如列出所有的数据库或者关闭服务器。
- local: 这个数据永远不会被复制,可以用来存储限于本地单台服务器的任意集合
- config: 当Mongo用于分片设置时,config数据库在内部使用,用于保存分片的相关信息。
MongoDB不正常关闭导致异常:
ERROR: child process failed, exited with error number 100
1. 删除mongod.lock文件,目录为: /data/mongo/data
2. 用repair的方式启动: /usr/share/mongodb/mongodb-linux-i686-2.4.9/bin/mongod --repair --dbpath=/data/mongo/data
3. 正常启动
四.MongoDB的常用命令:
1. 删除数据库:
db.dropDatabase()
2. 查询所有的数据库:
show dbs
3. 查询当前的数据库:
db
4. 删除数据库中的集合:
> use runoob
switched to db runoob
> show tables
site
> db.site.drop()
true
> show tables
5. 连接mongodb的客户端:
进入mongdb的斌目录,然后执行命令: ./mongo
6.正常关闭mongodb:
use admin db.shutdownServer()
或
mongod --shutdown
7.mongodb关于文档的操作:
a. 使用 insert() 或 save() 方法向集合中插入文档: db.集合名称.insert(document).
>db.col.insert({title: 'MongoDB 教程',
description: 'MongoDB 是一个 Nosql 数据库',
by: '菜鸟教程',
url: 'http://www.runoob.com',
tags: ['mongodb', 'database', 'NoSQL'],
likes: 100
})
b. 查看已插入文档: db.集合名称.find() ,也可以根据_id查询某条文档:
db.runoob.find(ObjectId("59e2e25753557f4869844e1a"))
c. 将数据定义为一个变量:
document=({title: 'MongoDB 教程',
description: 'MongoDB 是一个 Nosql 数据库',
by: '菜鸟教程',
url: 'http://www.runoob.com',
tags: ['mongodb', 'database', 'NoSQL'],
likes: 100
});
db.集合名称.insert(document)
d. 插入文档你也可以使用 save 命令,如果不指定 _id 字段 save() 方法类似于 insert() 方法。如果指定 _id 字段,则会更新该 _id 的数据。
e. 修改更新文档:
db.集合名称.update({'title':'MongoDB 教程'},{$set:{'title':'MongoDB'}}) //只更新一条
db.集合名称.update({'title':'MongoDB 教程'},{$set:{'title':'MongoDB'}},{multi:true}) //更新多条记录
指定_id,使用save方法:
db.runoob.save({
"_id" : ObjectId("59e2e25753557f4869844e1a"),
"title" : "MongoDB2",
"description" : "MongoDB 是一个 Nosql 数据库2",
"by" : "Runoob2",
"url" : "http://www.runoob.com2",
"tags" : [
"mongodb2",
"NoSQL2"
],
"likes" : 1102
})
更多修改操作:
只更新第一条记录:
db.col.update( { "count" : { $gt : 1 } } , { $set : { "test2" : "OK"} } );
全部更新:
db.col.update( { "count" : { $gt : 3 } } , { $set : { "test2" : "OK"} },false,true );
只添加第一条:
db.col.update( { "count" : { $gt : 4 } } , { $set : { "test5" : "OK"} },true,false );
全部添加加进去:
db.col.update( { "count" : { $gt : 5 } } , { $set : { "test5" : "OK"} },true,true );
全部更新:
db.col.update( { "count" : { $gt : 15 } } , { $inc : { "count" : 1} },false,true );
只更新第一条记录:
db.col.update( { "count" : { $gt : 10 } } , { $inc : { "count" : 1} },false,false );
f. 删除文档:
db.test.remove({'age':'25'}) //删除多个
db.test.remove({'age':'19'},{justOne:1}) //删除一个
db.test.remove({}) //全部删除
g. 查询文档:
一般查询: db.runoob.find({'title':'MongoDB2'}).pretty()
and 查询: db.runoob.find({'title':'MongoDB2','by':'Runoob2'}).pretty()
or 查询: db.runoob.find({$or:[{'title':'MongoDB2'},{'by':'Runoob3'}]})
混合查询: db.col.find({"likes": {$gt:50}, $or: [{"by": "菜鸟教程"},{"title": "MongoDB 教程"}]}).pretty() 类似常规 SQL 语句为: 'where likes>50 AND (by = '菜鸟教程' OR title = 'MongoDB 教程')'
h. 条件操作符:
MongoDB中条件操作符有:
- (>) 大于 - $gt
- (<) 小于 - $lt
- (>=) 大于等于 - $gte
- (<= ) 小于等于 - $lte
db.col.find({"likes" : {$gt : 100}}) 类似 Select * from col where likes > 100;
db.col.find({likes : {$gte : 100}}) 类似 Select * from col where likes >=100;
db.col.find({likes : {$lt :200, $gt : 100}}) 类似 Select * from col where likes>100 AND likes<200;
i.排序操作:
MongoDB中使用使用sort()方法对数据进行排序,sort()方法可以通过参数指定排序的字段,并使用 1 和 -1 来指定排序的方式,其中 1 为升序排列,而-1是用于降序排列
例子: db.col.find({},{"title":1,_id:0}).sort({"likes":-1})
j.聚合操作:
MongoDB中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果。有点类似sql语句中的 count(*)。
db.col.aggregate([{$group : {_id : "$title", num_tutorial : {$sum : 1}}}])
管道: 聚合管道将MongoDB文档在一个管道处理完毕后将结果传递给下一个管道处理
db.col.aggregate( [
... { $match : { likes : { $gt : 120, $lte : 200 } } },
... { $group: { _id: "$title", count: { $sum: 1 } } }
... ] );
db.col.aggregate(
... { $skip : 2 });
8. MongDB的复制以及恢复操作:
/usr/share/mongodb/mongodb-linux-i686-2.4.9/bin/mongodump -h 127.0.0.1 -d test -o /data/mongo/copy/${DATE}
//恢复到特定的库和集合:
/usr/share/mongodb/mongodb-linux-i686-2.4.9/bin/mongorestore --db test --collection col --drop /data/mongo/copy/test/col.bson
9. Mongdb的全文检索:
a. mongod --setParameter textSearchEnabled=true //开启全文检索,2.6版本以后默认已开启
b. db.posts.ensureIndex({post_text:"text"}) //对post_text字段建立全文索引
c. db.posts.runCommand("text",{search:"runoob"}) //使用全文索引搜索关键字
d. db.posts.getIndexes() //查找索引
e. db.posts.dropIndex("post_text_text") //删除索引