选取或者创建数据库
/**
创建数据库 不存在自动创建
只有当向数据库插入数据时,才会真正的创建数据库
**/
use db_name;
主 、从节点
-- 当前语句可以判断当前登录的主机是否是主节点
db.isMaster()
查看数据库
-- 查看数据库中的所有表
show dbs
db: MongoDB 全局变量,代表当前正在使用的数据库对象。当用户不显示的使用 use xxx 时,则表示 db为 test
数据库的备份与恢复
- 备份
mongodump -h dbhost -d db_name -o target_dir
- 恢复
-- 将 备份文件恢复到 指定主机的 db_name 数据库中
mongorestore -h host:port -d db_name back_file
删除数据库
-- 删除数据库(当前使用的数据库)
db.dropDatabase()
-- 查看数据库
show dbs
创建集合
// 创建集合 和 关系型数据库中的表类似
db.createCollection("clss1")
// 查看集合
show collections
show tables
// 当插入数据时,集合不存在会自动创建对应的集合
db.clss1.insertOne({
"name": "yp",
"age": 30
})
删除集合
-- 其中 col_name为集合的名字
db.col_name.drop()
集合重命名
-- 将 集合 clss1重命名为 clss0
db.clss1.renameCollection("clss0")
文档
- 类似与关系型数据库的的 记录(行) 数据的组织形式(k,v)形式和Python的字典类似, key: 文档的域 ;
- 必须是 utf-8格式的字符串 不能有 \0 键 同一个文档中 key不能重复 !!!
- 文档中的 键是有序的 且区分大小写
- value: 存储的数据 mongo支持的数据类型。
mongodb 支持的数据类型
整形 整数 1
布尔类型 true false
浮点型 3.141
Array 数组 [1,2,3]
Timestamp 时间类型
Date 时间日期
Object 内部文档
Null 空值 null
String 字符串
Symbol 特殊字符串
Binary data 二进制字符串
code 代码
regex 正则表达式
objectId ObjectId
集合中文档的特点
- 文档中的域的个数不一定一样
- 集合中的文档不一定有相同的域
插入数据 利用 insert_xxx
- 插入单个文档
db.stu.insertOne({
name: 'yx',
age: 18
})
-- 查看内容
db.stu.find()
- 插入多个文档
-- 一次插入多条数据 封装成为一个数组
db.stu.insertMany(
[ {name: "zs",age:23},
{name: "lisi",age:24}
])
-- 查看内容
db.stu.find()
利用save 命令插入
在不使用 _id 的情况下 和 insertOne insertMany 功能完全一样;而加 id字段时,当 id存在时,会替换原有文档,而 insertOne 或者 insertMany 会报错。
获取集合对象 类似MySQL中表的概念
db.getCollection('stu')
db.collect_name -- collect_name 表示集合的名称
筛选数据 query
基本语法 query(query, fields) 其中 query 查询条件; fields 结果集合中需要展示的字段。参数都是以 (k,v) 的格式。
- 查询满足条件的所有记录
-- 年龄 22
db.stu.find(
{age: 22}
)
-- id:0 表示不显示 _id 字段
db.stu.find(
{age: 22},{_id:0}
)
-- 指定显示 name age 字段 _id 只有明确设置为0才不显示
db.stu.find(
{age: 22},{name:1,age:1,_id:0}
)
-- 没有第二个参数 表示 显示所有文档
操作符(以$开头特殊意义的字符类似mysql中 关键词)
- 比较操作符
/*
使用 $符号注明一个特殊意义的字符。表达某个特定的含义
比较操作符
$eq =
$lt < age: {$lt: 22} 表示小于 22
$lte <= 小于等于 -- less equal than
$gt > age: {>: 22}
$gte >=
$in 相当于 in age: {$in: [18,22]} 精确值匹配
$nin 相当于 not in age: {$nin: [18,22]}
$ne 不等于 age: {$ne:22}
*/
db.stu.find(
{
age: {$eq: 22}
}
)
-- 等价于
db.stu.find({
age: 22
})
- 逻辑操作符
/*
$and 逻辑操作符 默认逗号就表示 and 关系
$or 逻辑或
$nor 既不也不
*/
-- 筛选 年龄在 18 ~ 22
age:{
$gte: 18, $lte:22
}
-- 筛选 年龄 在 18 ~ 22
{$and:
[{age:{$gte:18}},{age:{$lte:22}}]
}
-- 筛选 年龄 小于18 或者 大于 22
{age:{$not:{$gte:8,$lte:10}}}
-- 筛选name 为 xxx 或者 age 大于 18的记录
{$or: [{name:'yx'},{age:{$gt:18}}]}
-- 筛选 年龄为 yx 或者 age != 22
{$or: [{name:'yx'},{age:{$not:{$eq:22}}}]}
- 数组操作
/*
$size 数组的长度
$all 满足多个条件 默认只要一个匹配就行
-- 控制显示域
$slice: 2 显示数组中的前两项
-- 显示数组中指定的项目 索引从1开始
{grade:{$slice:[1,2]}}
*/
- 其它操作
/*
$exists {$exists:true} 某个域存在
{$exists:false} 某个域不存在
-- 数据类型查找
$type:1 当字段为数组时候 表示数组中的元素
*/
-- 查找性别存在的文档
db.stu.find({sex:{$exists:true}}
)
-- 性别不存在
db.stu.find({sex: {$not:{$exists:true}}}
)
db.stu.find({sex:{$exists:false}})
-- 查找年龄为偶数的文档
db.stu.find({age:{$mod:[2,0]}})
- 对结果进一步处理
/*
--显示前几条
limit(2)
skip(n)跳过前n条显示后面的记录
count() 记录的数目
sort({field:1/-1}) 1升序 -1 降序
*/
-- 按照 年龄降序
db.stu.find({},{_id:0}).sort({age:-1})
-- 按照年龄升序 姓名 升序
sort({age:-1,name:1})
- 删除文档
/*
delete 删除多条
db.stu.deleteMany({age:24})
-- 删除一条
db.stu.deleteOne({age:22})
-- 删除所有的文档
db.stu.deleteMany({})
db.stu.remove({})
*/
案例
use grade;
db.grade.insertMany([
{name: 'A001',age:10,sex:'m',habby:['basketball','sing','running']},
{name: 'A002',age:6,sex:'w',habby:['dance','computer']},
{name: 'B002',age:13,sex:'w',habby:['dance','draw','football']},
{name: 'B003',age:3,sex:'w',habby:['running']}
])
db.grade.insertOne({
name:'C005',age:8, sex:'w',habby:['draw','computer']
})
// 查询年龄大于10
db.grade.find({age:{$gt:10}})
// 查询年龄在8-11岁
db.grade.find({age:{$gte:8,$lte:11}})
db.grade.find({age:9,sex:'m'})
// 小于7岁或者大于11
db.grade.find({$or:[{age:{$lt:7}},{age:{$gt:11}}]})
// 年龄8岁或者11岁
db.grade.find({age:{$in:[8,11]}})
// 兴趣爱好有两项
db.grade.find({habby:{$size:2}})
// 爱好计算机的同学
db.grade.find({habby:'computer'})
// 喜欢跳舞 又喜欢画画
db.grade.find({habby:{$all:['draw','dance']}})
// 兴趣爱好2项学生数
db.grade.find({habby:{$size:3}}).count()
// 找到年龄第二大学生
db.grade.find().sort({age:-1}).skip(1).limit(1)
// 兴趣爱好的范围
db.grade.distinct('habby')
// 年龄最小的三个人
db.grade.find({}).sort({age:1}).limit(3)
// 年龄小于6岁 或者大于12
db.grade.find({
$nor:[{age:{$lt:6}},{age:{$gt:12}}]
})
更新操作
/**
更新操作符
$set 添加或者更新 域
$unset 删除 域
-- 删除性别这个字段
db.xxx.udpate({name:xxx},{$unset:{sex:''}})
$setOnInsert 添加时对应的字段作为域
-- 增加或者减少
$inc:{age:1}
$mul 所有的都乘法 xxx
-- 是的给定字段的最大值为设定为给定的值
$min:{field:v}
将小于给定字段的值修改为给定值
$max:{field:v}
- 针对数组类型的域操作
$push:{field:v} !!!向数组中添加(注意字段的类型)
-- 向数组中添加多项
$putAll:{filed:[x1,x2,..]}
-- 删除一项
$pull:{filed:v}
-- 数组删除多项
$pullAll
-- 类似循环
$each:[x1,x2]
-- 插入指定位置
{$push:{age:{$each:[1,2],$position:1}}
$each $sort 联合使用
$pop 弹出元素 删除
$pop:{field:-1} -- 弹出尾部元素
$pop:{field:-1} -- 弹出头部元素
$addToSet 不存在才添加 针对数组类型的域 或者字典类型
$mergeObjects 通常和$group 结合使用, 合并字典
*/
-- 所有的年龄都加1
db.grade.updateMany({},{$inc:{age:1}})
-- 将大于等于12的修改为12 小于的不改变
db.grade.updateMany({},{$min:{age:12}})
db.grade.updateOne({name:'A001'},{$push:{habby:{$each:[],$sort:-1}}})