MongoDB
MongoDB
NoSQL:not only sql
并行数据库:水平切分,分区查询
NoSQL数据库管理系统:非关系型、分布式、不支持ACID数据库设计范式
简单数据模型;
元数据库和数据分离;
弱一致性;
高吞吐量;
搞水平扩展能力和低端硬件集群;
数据存储类型:
列式存储模型;
文档数据模型;
键值数据模型;
图式数据模型;
列式模型:
应用场景:在分布式文件系统之上提供支持随机读写的分布式数据存储;
典型产品:HBase、Hypertable、Cassandra
数据模型:以列为中心进行存储,将同一列数据存储在一起;
优点:快速查询、高可扩展性、易于实现分布式扩展;
文档模型:
应用场景:非强事务性需求的web应用;
典型产品:MongoDB、ElasticSearch、CouchDB、
数据模型:键值模型,存储为文档;
优点:数据模型无需事先定义;
键值模型:(可持久存储)
应用场景:内容缓存,用于大量并行数据访问高负载场景;
典型产品:Redis、Memcached、DynamoDB、Riak;
数据模型:基于哈希表实现的key-value;
优点:查询迅速;
图式模型:
应用场景:社交网络,推荐系统,关系图谱;
典型产品:Neo4j、Infinite Graph;
数据模型:图式结构;
优点:适应于图式计算场景
MongoDB:NOSQL、文档存储、Json
database:
支持多个database
############################################################
MongoDB安装 port 27017
mongodb-3.4
yum安装:
[mongodb-org]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.4/x86_64/
gpgcheck=0
enabled=1
安装的软件:
mongodb-org-mongos
mongodb-org-server
mongodb-org-shell
mongodb-org-tools
rpm -ql mongodb-org-server
/etc/init.d/mongod
/etc/mongod.conf
/etc/sysconfig/mongod
/usr/bin/mongod
rpm -ql mongodb-org-shell
/usr/bin/mongo
rpm -ql mongodb-org-tools
/usr/bin/bsondump
/usr/bin/mongodump
/usr/bin/mongoexport
/usr/bin/mongofiles
/usr/bin/mongoimport
/usr/bin/mongooplog
/usr/bin/mongoperf
/usr/bin/mongorestore
/usr/bin/mongostat
/usr/bin/mongotop
配置文件:/etc/mongod.conf
# mongod.conf
# for documentation of all options, see:
# http://docs.mongodb.org/manual/reference/configuration-options/
# where to write logging data.
systemLog:
destination: file
logAppend: true
path: /var/log/mongodb/mongod.log
# Where and how to store data.
storage:
dbPath: /var/lib/mongo
journal:
enabled: true
# engine:
# mmapv1:
# wiredTiger:
# how the process runs
processManagement:
fork: true # fork and run in background
pidFilePath: /var/run/mongodb/mongod.pid # location of pidfile
# network interfaces
net:
port: 27017
bindIp: 127.0.0.1 # Listen to local interface only, comment to listen on all interfaces.
#security:
#operationProfiling:
#replication:
#sharding:
## Enterprise-Only Options
#auditLog:
#snmp:
------------------------
mongodb-2.6
# mongod.conf
#where to log
logpath=/var/log/mongodb/mongod.log
logappend=true
# fork and run in background
fork=true
#port=27017
#dbpath=/var/lib/mongo
dbpath=/mongodb/data/
# location of pidfile
pidfilepath=/var/run/mongodb/mongod.pid
# Listen to local interface only. Comment out to listen on all interfaces.
#bind_ip=127.0.0.1
# Disables write-ahead journaling
# nojournal=true
# Enables periodic logging of CPU utilization and I/O wait
#cpu=true
# Turn on/off security. Off is currently the default
#noauth=true
#auth=true
# Verbose logging output.
#verbose=true
# Inspect all client data for validity on receipt (useful for
# developing drivers)
#objcheck=true
# Enable db quota management
#quota=true
# Set oplogging level where n is
# 0=off (default)
# 1=W
# 2=R
# 3=both
# 7=W+some reads
#diaglog=0
# Ignore query hints
#nohints=true
# Enable the HTTP interface (Defaults to port 28017).
httpinterface=true
rest=true
# Turns off server-side scripting. This will result in greatly limited
# functionality
#noscripting=true
# Turns off table scans. Any query that would do a table scan fails.
#notablescan=true
# Disable data file preallocation.
#noprealloc=true
# Specify .ns file size for new databases.
# nssize=<size>
# Replication Options
# in replicated mongo databases, specify the replica set name here
#replSet=setname
# maximum size in megabytes for replication operation log
#oplogSize=1024
# path to a key file storing authentication info for connections
# between replica set members
#keyFile=/path/to/keyfile
---------------------------------------------------------
启动:
service mongod restart
ss -tnl
lsof -i:27017
lsof -i:28017
登录:
mongo --host 172.168.1.114
基本操作:
查询db:show dbs
进入db:use testdb
>help
db.help() help on db methods
db.mycoll.help() help on collection methods
sh.help() sharding helpers
rs.help() replica set helpers
help admin administrative help
help connect connecting to a db help
help keys key shortcuts
help misc misc things to know
help mr mapreduce
show dbs show database names
show collections show collections in current database
show users show users in current database
show profile show most recent system.profile entries with time >= 1ms
show logs show the accessible logger names
show log [name] prints out the last segment of log in memory, 'global' is default
use <db_name> set current database
使用帮助:db.help()
db.auth(username, password)
db.createCollection(name, { size : ..., capped : ..., max : ... } )
db.createUser(userDocument)
db.dropDatabase()
db.getName()
db.logout()
db.serverStatus()
db.stats()
db.version()
创建Mongodb数据库
由于Mongodb不是关系型数据库文件,实际上,它并不存在传统关系型数据库中的所谓“数据库”的概念。当你第一次新增数据时,mongodb就会以collection集合的形式进行保存和新建,而不需要你手工去新建立。
1> 定义新的数据库名:
use mkyongdb
> show dbs
admin 0.03125GB
local (empty)
注意,在use mkyongdb后,mkyongdb实际上还没真正建立起来,只是表明目前是在使用mkyongdb了
2> 保存数据:
定义一个collection,名为“users”,然后插入数据,如下:
> db.users.save( {username:"mkyong"} )
> db.users.find()
{ "_id" : ObjectId("4dbac7bfea37068bd0987573"), "username" : "mkyong" }
>
> show dbs -www.linuxidc.com-
admin 0.03125GB
local (empty)
mkyongdb 0.03125GB
---------------------------
常用命令:
help
db.help()
db.yourColl.help()
db.youColl.find().help()
rs.help()
db.stats():数据库状态
db.serverSstatus():mongodb数据库服务器状态
show dbs ---显示数据库列表;
show collections ---显示当前数据库中的集合(类似关系型数据库中的表);
show users ---显示用户;
use <db_name> ---切换当前数据库,这和MS-SQL里面的意思一样;当创建一个集合(table)的时候会自动创建当前数据库;
db.dropDatabase() ---删除当前使用的数据库;
db.cloneDatabase(“127.0.0.1”) ---从指定主机上克隆数据库:将指定机器上的数据库的数据克隆到当前数据库;
db.copyDatabase("mydb","temp","127.0.0.1") ---从指定的机器上复制指定数据库数据到某个数据库:将本机的mydb的数据复制到temp数据库中;
db.repairDatabase() ---修复当前数据库;
db.getName()/db ---查看当前使用的数据库;
db.stats() ----显示当前db状态;
db.version() ---当前db版本;
db.getMongo() ---查看当前db的链接机器地址;
Collection聚集集合:
db.createCollection(“collName”, {size: 20, capped: 5, max: 100}) ---创建一个聚集集合(table);
db.getCollection("account") ---得到指定名称的聚集集合(table);
db.getCollectionNames() ---得到当前db的所有聚集集合;
db.printCollectionStats() ---显示当前db所有聚集索引的状态;
用户相关:
db.addUser("name") ---添加一个用户;
db.addUser("userName","pwd123",true) ---添加用户、设置密码、是否只读;
db.auth("userName","123123") ---数据库认证、安全模式;
show users ---显示当前所有用户;
db.removeUser("userName") ---删除用户;
db.createUser({user:'admin',pwd:'123456', roles:[{role:'readWriteAnyDatabase', db:'xxx'}]}) db.createUser({user:'superadmin',pwd:'123456', roles:[{role:'root', db:'admin'}]})
Roles(内置角色): 1. 数据库用户角色:read、readWrite; 2. 数据库管理角色:dbAdmin、dbOwner、userAdmin; 3. 集群管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager; 4. 备份恢复角色:backup、restore; 5. 所有数据库角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase 6. 超级用户角色:root // 这里还有几个角色间接或直接提供了系统超级用户的访问(dbOwner 、userAdmin、userAdminAnyDatabase) 7. 内部角色:__system
具体角色:
Read:允许用户读取指定数据库 readWrite:允许用户读写指定数据库 dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile userAdmin:允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户 clusterAdmin:只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。 readAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读权限 readWriteAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读写权限 userAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的userAdmin权限 dbAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限。 root:只在admin数据库中可用。超级账号,超级权限
其他
db.getPrevError() ---查询之前的错误信息;
db.resetError() ---清除错误记录;
查看聚集集合基本信息:
查看帮助 db.yourColl.help()
查询当前集合的数据条数 db.yourColl.count()
查看数据空间大小 db.userInfo.dataSize()
得到当前聚集集合所在的db db.userInfo.getDB()
得到当前聚集的状态 db.userInfo.stats()
得到聚集集合总大小 db.userInfo.totalSize()
聚集集合储存空间大小 db.userInfo.storageSize()
Shard版本信息 db.userInfo.getShardVersion()
聚集集合重命名 db.userInfo.renameCollection("users"); 将userInfo重命名为users
删除当前聚集集合 db.userInfo.drop()
聚集集合查询:
1、查询所有记录
db.userInfo.find()
相当于:select* from userInfo
默认每页显示20条记录,当显示不下的情况下,可以用it迭代命令查询下一页数据。注意:键入it命令不能带“;”
但是你可以设置每页显示数据的大小,用DBQuery.shellBatchSize= 50;这样每页就显示50条记录了。
2、查询去掉后的当前聚集集合中的某列的重复数据
db.userInfo.distinct("name")
会过滤掉name中的相同数据
相当于:select distict name from userInfo;
3、查询age = 22的记录
db.userInfo.find({"age":22});
相当于: select * from userInfo where age = 22
4、查询age > 22的记录
db.userInfo.find({age:{$gt:22}})
相当于:select * from userInfo where age >22
5、查询age < 22的记录
db.userInfo.find({age:{$lt:22}})
相当于:select * from userInfo where age <22
6、查询age >= 25的记录
db.userInfo.find({age:{$gte:25}})
相当于:select * from userInfo where age >= 25
7、查询age <= 25的记录
db.userInfo.find({age:{$lte:25}})
8、查询age >= 23 并且 age <= 26
db.userInfo.find({age:{$gte:23,$lte:26}});
9、查询name中包含 mongo的数据
db.userInfo.find({name:/mongo/})
//相当于%%
select * from userInfo where name like '%mongo%’
10、查询name中以mongo开头的
db.userInfo.find({name:/^mongo/})
select * from userInfo where name like ‘mongo%'
11、查询指定列name、age数据
db.userInfo.find({}, {name:1, age:1})
相当于:select name, age from userInfo
当然name也可以用true或false,当用ture的情况下河name:1效果一样,如果用false就是排除name,显示name以外的列信息。
12、查询指定列name、age数据, age>25
db.userInfo.find({age:{$gt:25}},{name:1,age:1})
相当于:select name,age from userInfo where age >25
13、按照年龄排序
升序:db.userInfo.find().sort({age:1});
降序:db.userInfo.find().sort({age:-1});
14、查询name = zhangsan, age = 22的数据
db.userInfo.find({name:'zhangsan',age:22})
相当于:select * from userInfo where name = 'zhangsan' and age = '22'
15、查询前5条数据
db.userInfo.find().limit(5)
相当于:selecttop 5 * from userInfo
16、查询10条以后的数据
db.userInfo.find().skip(10)
相当于:select * from userInfo where id not in (selecttop 10 * from userInfo)
17、查询在5-10之间的数据
db.userInfo.find().limit(10).skip(5)
可用于分页,limit是pageSize,skip是第几页*pageSize
18、or与 查询
db.userInfo.find({$or:[{age:22},{age:25}]})
相当于:select * from userInfo where age = 22 or age = 25
19、查询第一条数据
db.userInfo.findOne()
相当于:selecttop 1 * from userInfo
db.userInfo.find().limit(1)
20、查询某个结果集的记录条数
db.userInfo.find({age:{$gte:25}}).count()
相当于:select count(*) from userInfo where age >= 20
21、按照某列进行排序
db.userInfo.find({sex:{$exists:true}}).count()
相当于:select count(sex) from userInfo
索引:
1、创建索引
db.userInfo.ensureIndex({name:1})
db.userInfo.ensureIndex({name:1,ts:-1})
2、查询当前聚集集合所有索引
db.userInfo.getIndexes()
3、查看总索引记录大小
db.userInfo.totalIndexSize()
4、读取当前集合的所有index信息
db.users.reIndex()
5、删除指定索引
db.users.dropIndex("name_1")
6、删除所有索引索引
db.users.dropIndexes()
修改、添加、删除集合数据
1、添加
db.users.save({name:'zhangsan',age:25,sex:true})
添加的数据的数据列,没有固定,根据添加的数据为准
2、修改
db.users.update({age:25},{$set:{name:'changeName'}}, false, true)
相当于:update users set name = 'changeName' where age = 25
db.users.update({name:'Lisi'},{$inc:{age:50}},false,true)
相当于:update users set age = age + 50 where name = 'Lisi'
db.users.update({name:'Lisi'},{$inc:{age:50},$set:{name:'hoho'}},false,true)
相当于:update users set age = age + 50,name = 'hoho' where name = 'Lisi'
3、删除
db.users.remove({age:132})
4、查询修改删除
db.users.findAndModify({
query: {age: {$gte: 25}},
sort: {age: -1},
update: {$set: {name: 'a2'}, $inc: {age: 2}},
remove: true
})
db.runCommand({ findandmodify : "users",
query: {age: {$gte: 25}},
sort: {age: -1},
update: {$set: {name: 'a2'}, $inc: {age: 2}},
remove: true
})
db.help() ---显示数据库操作命令,里面有很多的命令
db.foo.help() ---显示集合操作命令,同样有很多的命令,foo指的是当前数据库下,一个叫foo的集合,并非真正意义上的命令
db.foo.find() ---对于当前数据库中的foo集合进行数据查找(由于没有条件,会列出所有数据)
db.foo.find( { a : 1 } ) ---对于当前数据库中的foo集合进行查找,条件是数据中有一个属性叫a,且a的值为1
db.getCollectionNames()
DDL,DML
JSON:JavaScript Object Notation
db.students.insert({name:"tom",age:25})