mongoDB的存储方式是文档式存储,并不是Key-Value形式。存储在集合中的文档,被存储为键-值对的形式。键用于唯一标识一个文档,为字符串类型,而值则可以是各种复杂的文件类型。我们称这种存储形式为BSON(Binary JSON)。
模式自由(schema-free),意味着对于存储在mongodb数据库中的文件,我们不需要知道它的任何结构定义。如果需要的话,你完全可以把不同结构的文件存储在同一个数据库里。
mongoDB中有三元素:数据库,集合,文档,其中“集合”就是对应关系数据库中的“表”,“文档”对应“行”。
安装:
下载:wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel62-3.2.9.tgz
解压:tar -zxvf mongodb-linux-x86_64-rhel62-3.2.9.tgz
创建目录:mv mongodb-linux-x86_64-rhel62-3.2.9 mongodb
mkdir /usr/local/mongodb/data
mkdir /usr/local/mongodb/data/db
mkdir /usr/local/mongodb/data/logs
写配置文件
touch /usr/local/mongodb/mongodb.conf
bind_ip=0.0.0
port=27017
#端口号
dbpath=/usr/local/mongodb/data/db
#数据目录
logpath=/usr/local/mongodb/data/logs/mongodb.log
#日志目录
fork=true
#设置后台运行
logappend=true
#日志输出方式
shardsvr=true
directoryperdb=true
#auth=true
#开启认证
启动:./bin/mongod --config /usr/local/mongodb/mongodb.conf
连接:
./bin/mongo
查看安装信息:
db.runCommand({"buildInfo":1})
权限:
可以将 MongoDB 的用户分为两类:超级用户和数据库用户。超级用户拥有最大权限,可以对所有数据库进行任意操作,超级用户储存在 admin 数据库中,刚安装的 MongoDB 中 admin 数据库是空的。
数据库用户存储在单个数据库中,只能访问对应的数据库。另外,用户信息保存在 db.system.users 中。
关于用户和权限有以下特性:
- 数据库是由超级用户来创建的,一个数据库可以包含多个用户,一个用户只能在一个数据库下,不同数据库中的用户可以同名
- 如果在 admin 数据库中不存在用户,即使 mongod 启动时添加了 –auth 参数,此时不进行任何认证还是可以做任何操作
- 在 admin 数据库创建的用户具有超级权限,可以对 MongoDB 系统内的任何数据库的数据对象进行操作
- 特定数据库比如 test1 下的用户 test_user1,不能够访问其他数据库 test2,但是可以访问本数据库下其他用户创建的数据
- 不同数据库中同名的用户不能够登录其他数据库。比如数据库 test1 和 test2 都有用户 test_user,以 test_user 登录 test1 后,不能够登录到 test2 进行数据库操作
创建超级用户:
userAdminAnyDatabase 权限只是针对用户管理的,对其他信息(读写数据等)是没有权限的。(root角色可以)。
use admin
db.createUser(
{
user: "buru",
pwd: "12345678",
roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
}
)
创建数据库用户:
认证:
所有帐号都需要认证后才能操作。只能在帐号创建库下认证,才能再去其他库进行操作(哪里创建哪里认证)。
查看所有用户:
CRUD:
use myinfo
document=({"user_id" : "ABCDBWN","password" :"ABCDBWN" ,"date_of_join" :
"15/10/2010" ,"education" :"B.C.A." , "profession" : "DEVELOPER","interest" :
"MUSIC","community_name" :["MODERN MUSIC", "CLASSICAL
MUSIC","WESTERN MUSIC"],"community_moder_id" : ["MR. BBB","MR. JJJ","MR
MMM"],"community_members" : [500,200,1500],"friends_id" :
["MMM123","NNN123","OOO123"],"ban_friends_id" :
["BAN123","BAN456","BAN789"]});
db.userdetails.insert(document)
db.userdetails.find();
db.testtable.find({age : {$lt :24, $gt : 17}})
db.users.find({name: {$type: 2}});//根据数据类型,2表示字符串。
db.mycol.find({}).limit(1).skip(1)
db.mycol.find({}).sort({"title":-1})//1为升序,-1为降序。
db.collection.update( criteria, objNew, upsert, multi )
update()函数接受以下四个参数:
- criteria : update的查询条件,类似sql update查询内where后面的。
- objNew : update的对象和一些更新的操作符(如$,$inc...)等,也可以理解为sql update查询内set后面的
- upsert : 这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。
- multi : mongodb默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
db.recru.update({"name":"joe"},{$set:{"age":25}})
db.test.update( { "age" : { $gt : 20 } } , { $set : { "age_level" : "20"} },false,true );
删除表,集合,库
db.userdetails.remove( { "user_id" : "testuser" } )
db.userdetails.drop()
db.dropDatabase()
MongoDB使用 ensureIndex() 方法来创建索引:
db.mycol.ensureIndex({"title":1})//单列索引,1为指定按升序创建索引,-1为降序。
db.mycol.ensureIndex({"title":1,"description":-1})//多列索引。
db.values.ensureIndex({open: 1, close: 1}, {background: true})//在后台(非阻塞)创建索引。
db.test.ensureIndex({"userid":1},{"unique":true})//唯一索引
db.test.getIndexes()//查看索引
db.test.dropIndex({"username":1})//删除索引
聚合操作:
db.mycol.aggregate([{$group : {_id : "$owner_id", num_tutorial : {$sum : 1}}}]) //计算每个拥有者拥有的数量。
管道操作:
结果中就只还有_id,tilte和author三个字段了,默认情况下包含_id
db.article.aggregate(
{ $project : {
title : 1 ,
author : 1 ,
}}
);
不包含_id
db.article.aggregate(
{ $project : {
_id : 0 ,
title : 1 ,
author : 1
}});
$match用于获取分数大于70小于或等于90记录,然后将符合条件的记录送到下一阶段$group管道操作符进行处理。
db.articles.aggregate( [
{ $match : { score : { $gt : 70, $lte : 90 } } },
{ $group: { _id: null, count: { $sum: 1 } } }
] );
经过$skip管道操作符处理后,前五个文档被"过滤"掉。
db.article.aggregate(
{ $skip : 5 }
);
参考:
https://wizardforcel.gitbooks.io/w3school-mongodb/content/10.html