linux:
kill -2 进程号:强制关闭某程序,mongod进程号可通过ps -ef | grep mongod命令获取
ps -ef | grep mongod:查询mongodb运行状态
reboot:重启计算机
/user/local/mongodb/conf/mongodb.conf:linux中mongodb配置文件路径
启动mongodb:
mongodb -f(或--config) ..... /mongodb.conf //利用配置文件启动服务端
mongo //启动客户端
mongo --host 127.0.0.1 --port 3333 :启动主机号为127.0.0.1,及端口号为 3333
windows平台安装:
1、命令行参数
(1)创建三个文件夹(data、db.logs)和一个日志文件(mongodb.log)
存储数据库文件 存储日志文件
(2)启动MongoDB服务器命令
mongod --dbpath C:\Users\86186\Desktop\NOSQL\mongodb-win32-x86_64-2012plus-4.2.2\data\db --logpath C:\Users\86186\Desktop\NOSQL\mongodb-win32-x86_64-2012plus-4.2.2\logs\mongodb.log --logappend
mongod --dbpath C:\replicaset2\data\db --logpath C:\replicaset2\logs\mongodb.log --port 2222 --replSet hbsi0
//replSet hbsi0 :创建一个名为hbsi0的副本集
2.配置文件:(放置在mongod.conf)
storage:
dbPath: DAMongoDBimongodb-win32-x86_64-2012plus-4.2.2%ydataldbsystemLog:
destination: file
path: D:MongoDBmongodb-win32-x86_64-2012plus-4.2.2logsimongodblogiogAppend: true
ACID原则:???
提供了稳定性和可靠性
事务:???
关系型数据库和非关系型数据库:
?????
关系型数据库:二维表结构(拥有ACID原则)
扩展性不如非关系型数据库
非关系型数据库:高并发读写,高扩展,高效率存储和访问需求(不具备ACID原则),分布式
NOSQL与mysql的区别:
mysql是传统的关系型数据库
示例:
select * from 表名
NOSQL是非关系型数据库
极具灵活性,易扩展
NOSQL数据库:键值对,文档,列式,图形
键值对:(key:value)
{学号:“1001”,姓名:“小明”,年龄:“20”,班级:“一班”}//示例(支持内嵌)
//键值对感觉有点像Python中的字典,css中的属性
//也可当做对象来进行处理,但是属性可任意删改添加。感觉每个每个文档都是独立的个体
关于mongodb:
关系型数据库 mongodb(非关系型数据库)
增删改查 增删改查
索引 索引
数据库 数据库
数据表 集合
记录 文档
//集合类似于关系型数据库(例如mysql)中的数据表,但是mongodb不需要定义任何模式
//每个集合都可以包含无限数量的文档,而文档是集合中的基本单元
示例:
{学号:“1001”,姓名:“小明”,年龄:“20”,班级:“一班” 成绩:[{数学:80,语文:90}]
{学号:“1002”,姓名:{姓:“小”,名:“李”},年龄:“20”,班级:“一班”,爱好:["读书","篮球"]}
//注意:疑似内嵌时有列表的概念,列表内也可以嵌套集合
一条记录或者说一个集合转换成一个文档
关于集合:
集合分为“一般集合”和“上限集合”
一般集合:该集合没有固定的形式(需要注意的是:通常插入集合的数据一般都具有关联性)
上限集合:该集合会限制集合的容量大小,在数据存满时,会从头进行覆盖,进行循环写入。
关于文档:
文档以键对值的形式存储在集合中,
键(key)具有唯一性,且为字符串类型,值(value)可以是各种类型
每个文档都有一个默认的_id键,类似于“关系型数据库”中的主键,该键在同一个集合中必须是唯一的
如果用户不手动设置,会自动生成一个位移的ObjectId值进行填充
关于_id:
详细在NoSQL课本第17页。 ╮(╯▽╰)╭
mongo.exe:启动MongoDB Shell客户端
mongod.exe:启动MongoDB服务器
Mongodb命令:
show collections:显示当前下所有集合
show dbs:显示所有数据库情况
db:显示数据库的当前对象
use 数据库名:新建数据库
//如果要创建的数据库存在,切换到该数据库
//如果要创建的数据库不存在,创建该数据库
db.dropDatabase():删除数据库
//注意:为了防止误删可执行命令db验证当前数据库是否为指定删除的数据库
db.集合名.drop():删除集合
db.createCollection(“集合名称”):显式创建集合
db.集合名.insert({name:“tom”,age:20})隐式创建(在创建文档的同时,如果集合不存在,则自动将集合创建出来)
//隐式创建参数为 文档
db.collectionName.drop():删除数据库中的集合
db.collectionName.insert():向集合中插入文档
db.collectionName.find():查询文档内容
db.集合名.find().pretty():格式化查询返回的结果
文档(增删改查):
db.集合名.insert(文档):单文档插入
db.集合名.save(文档):单文档插入
db.集合名.insertMany([文档1,文档2,...]):多文档插入(插入时需要用数组,文档作为数组元素)
//文档示例:
{name:“tom”,age:20}
db.集合名.update(criteria,objNem,upsert,multi):文档数据更新
critera:筛选条件
objNem:更新的数据(注意:更新的数据会直接覆盖文档)
//可以使用 {$set:{要更新的数据}}
upsert:不存在更新对象时是否插入,默认为false
multi:默认为false,只更新查找的第一个文档,反之更新全部文档
db.集合名.remove({删除文档条件}):删除指定文档
db.集合名.remove({}):删除全部文档
db.集合名.find():查询所有文档
db.集合名.find().pretty():格式化查询返回结果
db.集合名.find({查询条件}).hint({键名:-1或1}):强制查询指定的索引
//1 是升序 -1 是降序
db.集合名.find(条件语句).explain():查看当前语句的查询计划
*****关于按条件查询:
逻辑操作符:
$and:与
$or:或
示例:
db.集合名.find({$and:[{key1:value1},{key2:value2}]})
({$or:[...]})
比较操作符:
$gt:大于 {age:{$gt:18}} :age>18
$lt:小于 {age:{$lt:18}} :age<18
$gte:大于等于 ......
$lte:小于等于
$ne:不等于
$in:包含 {_id:{$in:["1","3"]}}
$nin:不包含 {_id:{$nin:["1","3"]}}
关于正则表达式的使用:
(1)/^以什么开头/
db.集合名.find({集合名:/^专家/})
(2)/以什么结尾$/
db.集合名.find({集合名:/关键字$/})
(3)//包含什么
db.集合名.find({集合名:/关键字/})
关于嵌套文档查询:
db.集合名.find({<key>.<key>:<value1>})
示例:db.comment.fin("phone.homePhone":“82174911”)
1.Null 类型查询
db.comment.find({"state":null}).pretty()
2. 关于正则表达式查询:
(1)以/^以什么开头/
查询集合comment中评论内容content值以"专家"开头的文档?
db.comment.find({content:/^专家/})
(2) /以什么结尾$/
查询集合comment中评论内容content值以"水" 结尾的文档?
db.comment.find({content:/水$/})
(3) /包含什么内容/
查询集合comment 中 评论内容content包含 "冬天" 的文档?
db.comment.find({content:/冬天/})
3. 嵌套文档查询之精确查询
查询comment集合中phone包含的子文档中homePhone的值为62771541且mobilePhone的值为13262984142的文档?
db.comment.find({"phone.mobilePhone":"13065840128"})
4. 嵌套文档查询之点查询
db.集合名.find({<key>.<key1>:<value1>})
查询comment集合中phone包含的子文档中homePhone的值为82174911的文档?
db.comment.find({"phone.homePhone":"82174911"})
db.comment.find({"phone.mobilePhone":"1306580128"})
聚合管道
$group [{$group:{"_id":"$class"}}] group ny class
$limit $limit:5 limit 5,5 分页
$match 过滤查找
$sort {$sort:{age:-1}} order by 排序
$project {$project:{stuid:1,name:1,_id:0}}
$skip {$skip:5}
关于分组:
$group 分组
db.集合名.aggregate([{$group:{_id:"$<key2>"}}])
实例: 在stu集合中按class 键进行分组操作?
db.stu.aggregate([{$group:{"_id":"$class"}}])
将集合comment中的文档按userid进行分组?
db.comment.aggregate([{$group:{"_id":"$userid"}}])
将集合comment中的文档按state 进行分组?
db.comment.aggregate([{$group:{"_id":"state"}}])
$limit :限制mongodb聚合管道返回的文档数
db.集合名.aggregate({$limit:整型数字})
{name:{firstname:"wang") 模糊查询 like '王%'
db.stu.find({ "name.firstname":"wang"))
{name:{firstname:"li",lastname:"ming"}精确查询
db.stu.find({name:{firstname:"li" ,lastname:" ming")
关于筛选$match:
db.集合名.aggregate([{$match:{<key>:<value>}}])
过滤条件
按条件查询 查询条件 过滤条件
db.comment.find(i"_id":"1")) db.comment.aggregate({$match:{"_id":1))
按照查询条件将所需文档显示出来 将输入的文档按照过滤条件处理之后传递给后续的管道操作符
(主查阅) (有返回结果,主后续)
包含子文档
{name:{firstname:"wang"}} 模糊查询 like '王%'
db.stu.find({"name:firstname":"wang"}) name 的子文档为firstname
{name:{firstname:"li",lastname:"ming"}} 精确查询
db.stu.find({name:{firstname:"li",lastname:"ming"}})
查询null:db.stu.find({"name":null})
$match
语法: db.COLLECTION_NAME.aggregate([{$macth:{<key>:<value>}}])
过滤条件
按条件查询 查询条件 过滤条件
db.comment.find({"_id":"1"}) db.comment.aggregate({$match:{"_id":"1"}})
按照查询条件将所需文档显示出来 将输入的文档按照过滤条件处理之后传递给后续的管道操作符
[{$match},{$project},{$sort},{$limit}]
$sort 排序 (stu集合) mysql 正序 (升序) 倒叙 (降序)
语法:{$sort:{待排序的键名:1或者-1}} select * from student order by age desc
说明:1 代表升序 , -1代表降序
实例1: 对stu集合中的age键进行降序排序?
db.stu.aggregate({$sort:{age:-1}})
实例2: 对stu集合中的age键进行升序排序?
db.stu.aggregate({$sort:{age:1}})
db.comment.aggregate({$sort:{age:1}})
$project 映射
{$project:{age:1}}
语法:{$project:{键名:0或者1}}
说明:
键名:指的是用户想要隐藏或者显示的键的名字。
0:隐藏前边指定的键的键值对
1:只显示前边指定的键的键值对,同时如果不明确的隐藏_id键值对,则返回结果会包含_id和指定要显示的键值对
实例1:在查询结果中不显示集合comment中的age 键值对?
db.comment.aggregate({$project:{age:0}})
实例2:在查询结果中显示集合comment中的age 键值对?
db.comment.aggregate({$project:{age:1}})
实例3:在查询结果中只显示集合comment中的age 键值对?
db.comment.aggregate({$project:{_id:0,age:1}})
db.comment.aggregate({$project:{_id:0,nickname:1)
$skip 跳过指定数量的文档,返回剩余的文档
//注意:{$skip:跳过的文档个数}
实例1:在comment集合中跳过5个文档?
db.comment.aggregate({$skip:5})
db.comment.aggregate({$skip:3))
实例2:在comment集合中显示第2到4个文档? {$skip:1},{$limit:3}
db.comment.aggregate({$skip:1},{$limit:3}})
关于管道表达式:
管道表达符
$sum
语法:
db.集合名.aggregate({$group:{"_id":"$分组字段名","自定义名字":{$sum:"$需要进行累加的字段名"}}})
实例1:将集合product 中的 文档按类型type进行分组并计算各个分组的价格price总和?
db.product.aggregate({$group:{"_id":"$type","价格总和":{$sum:"$price"}}})
实例2:在集合comment中,计算每篇文档的评论人数?
db.comment.aggregate({$group:{"_id":"$articleid","评论人数":{$sum:1}}})
$avg平均值
实例1:将集合product中的文档按照类型type进行分组,并计算各个分组的price平均值?
db.product.aggregate({$group:{"_id":"$type","价格平均值":{$avg:"$price"}}})
实例2:在集合comment中,计算每篇文章评论人的平均年龄?
db.comment.aggregate({$group:{"_id":"$articleid","评论人喜欢的数字的平均值":{$avg:"$likenum"}}})
$min
实例1:将集合product中的文档按照类型type进行分组,并计算各个分组的price最小值?
db.product.aggregate({$group:{"_id":"$type","最小值":{$min:"$price"}}})
$max
实例1:将集合product中的文档按照类型type进行分组,并计算各个分组的price最大值?
db.product.aggregate({$group:{"_id":"$type","最大值":{$max:"$price"}}})
$push
实例1:将集合product中的文档按照类型type进行分组,并将各个分组的产品插入到一个数组tags中?
db.product.aggregate({$group:{"_id":"$type","tags":{$push:"$name"}}})
实例2:将集合comment中,罗列出每篇文章的评论人昵称?
db.comment.aggregate({$group:{"_id":"$articleid","tags":{$push:"$nickname"}}})
$first
实例1:将集合product中的文档按类型type进行分组,并获取各个分组中第一个产品?
db.product.aggregate({$group:{"_id":"type","第一个产品":{$first:"$name"}}})
$last
(1)分组语句
db.product.aggregate({$group:{"_id":"$type"}})
(2)累加语句
关于mapReduce的操作:
db.集合名.mapReduce(
function(){
//map函数
emit(key,value);
},
function(key,values){ //key,values参数名不需要更改
//reduce函数
return reduceFunction //例 return Array.sum(values)
},
{
query:条件,
out:New_COLLENTION_NAME,
sort:条件,
limit:number
}
)
map函数作用:调用emit方法,遍历集合中的所有文档,返回键值对,并将结果输入到reduce函数中
reduce函数作用:将key-values变为key-value,将数组变为单一的值
query参数:它的值为条件,用于筛选文档(符合条件才会调用map函数)
out参数:值为集合,用于存放统计后的结果
sort参数:可选项,可结合limit使用,用于排序操作
limit参数:可选项,限定输入map函数的文档数量
关于索引部分:
db.集合名.getIndexes():查看索引
db.集合名.totalIndexSize():查看索引大小
db.集合名.createIndex(keys,options):创建索引
keys:类型是文档类型(keys:{age:1})
// 指定值为1,升序,指定为-1,则是倒序
options:有两个参数(书67页)(可选项)
unique:创建的索引是否唯一,ture(唯一),false(默认值,不唯一)
name:指定索引的名字
示例:db.集合名.createIndex({键名:1或-1},{name:“索引名称”})
db.集合名.nesureIndex({key:1},{name:indexName}):在查询字段上添加索引(与cerateIndex一样)
key:键名
name:自定义索引名
db.集合名.dropIndex(index):删除单个索引
db.集合名.dropIndexes():删除所有索引
db.集合名.find({查询条件}).hint({键名:-1或1}):强制查询指定的索引
//1 是升序 -1 是降序
db.集合名.find().explain():
扩展:mongodb
支持for循环:
示例:
for(var i=0;i<200000;i++){
db.books.insert({number:i,name:i+"book"})
}
支持new Date();
支持var 变量名 的创建;
var start=new Date();
db.books.find({number:15870})
var end=new Date();
end-start
关于副本集:
初始化副本集:
db.runCommand({"replSetlnitiate":{
"_id":"hbsi0",
members:[
{
"_id":1,
host:"127.0.0.1:2222"
},
{
"_id":2,
host:"127.0.0.1:3333"
}
]}})
rs.add("127.0.0.1:4444"):添加副本节点,该节点主机号为127.0.0.1,及端口号为4444
rs.addArb("127.0.0.1:4444"):添加仲裁节点,该节点主机号为127.0.0.1,及端口号为4444
rs.status():查看副本集成员状态信息
rs.slaveOk()开启副本节点的读取权限(默认情况下副本节点不可以查询副本集中的内容)