Mongodb基本操作
查询数据库
show databases
切换数据库
use test
查询当前数据库下面的集合
show collections
创建集合
db.createCollection("集合名称")
删除集合
db.集合名称.drop()
删除数据库
db.dropDatabase() //首先要通过use切换到当前的数据库
Mongodb增删改查(CURD)
id 系统会自动加一个
时间戳+机器码 生成
增(insert)
新增一条
db.userinfo.insert({name:"贾宝玉",age:25,gander:"男",address:'贾府'})
新增多条
db.userinfo.insert([{name:"贾宝玉",age:25,gander:"男",address:'贾府'}
,{name:"林黛玉",age:16,gander:"女",address:'林府'}])
可不可以快速插入10条数据
for(var i=1;i<=10;i++)
{
db.userinfo.insert({name:"clay"+i,age:i})
}
查(find)
查询所有的数据
db.集合名称.find({})
查询top条数
db.集合名称.find({}).limit(条数)
条件查询
db.userinfo.find({name:"clay1",age:1},{name:1,_id:0})
排序&分页
db.c1.insert({_id:1,name:"a",sex:1,age:1})
db.c1.insert({_id:2,name:"a",sex:1,age:2})
db.c1.insert({_id:3,name:"b",sex:2,age:3})
db.c1.insert({_id:4,name:"c",sex:2,age:4})
db.c1.insert({_id:5,name:"d",sex:2,age:5})
db.c1.find()
正序
db.c1.find({}).sort({age:1})
降序
db.c1.find({}).sort({age:-1})
分页查询 跳过两条查询两条
db.c1.find({}).sort({age:1}).skip(2).limit(2)
运算符
运算符 | 作用 |
---|---|
$gt | 大于 |
$gte | 大于等于 |
$lt | 小于 |
$lte | 小于等于 |
$ne | 不等于 |
$in | in |
$nin | not in |
//年龄大于1
db.c1.find({age:{$gt:1}})
//年龄是 3,4,5的
db.c1.find({age:{$in:[3,4,5]}})
改(update)
db.集合名.update(条件, 新数据) {修改器: {键:值}}
修改器 | 作用 |
---|---|
$inc | 递增 |
$rename | 重命名列 |
$set | 修改列值 |
$unset | 删除列 |
准备数据
db.c1.insert({name:"8888",age:1,addr:'address',flag:true})
db.c1.update({name:"8888"}, {name:"99"})
db.c1.update({name:"8888"},
{
$set:{name: "zs44"},//修改字段name的值
$inc:{age:10}, //字段age的值加10
$rename:{addr:"address"} ,//修改字段名称addr 为address
$unset:{flag:""} //删除字段flag
}
)
db.c1.find({name:"zs44"})
删(delete)
//全部移除
db.userinfo.deleteMany({})
db.userinfo.deleteMany({age:1})
聚合查询
顾名思义就是把数据聚起来,然后统计
语法
db.集合名称.aggregate([
{管道:{表达式}}
....
])
常用管道
$group 将集合中的文档分组,用于统计结果
$match 过滤数据,只要输出符合条件的文档
$sort 聚合数据进一步排序
$skip 跳过指定文档数
$limit 限制集合数据返回文档数
....
常用表达式
$sum 总和 $sum:1同count表示统计
$avg 平均
$min 最小值
$max 最大值
...
准备
use test4
db.c1.insert({_id:1,name:"a",sex:1,age:1})
db.c1.insert({_id:2,name:"a",sex:1,age:2})
db.c1.insert({_id:3,name:"b",sex:2,age:3})
db.c1.insert({_id:4,name:"c",sex:2,age:4})
db.c1.insert({_id:5,name:"d",sex:2,age:5})
练习
-
统计男生、女生的总年龄
db.c1.aggregate([
{
$group:{
_id: "$sex",
rs: {$sum: "$age"}
}
}
])
-
统计男生、女生的总人数
db.c1.aggregate([
{
$group:{
_id: "$sex",
rs: {$sum:1}
}
}
])
-
求学生总数和平均年龄
db.c1.aggregate([
{
$group:{
_id: null,
total_num: {$sum:1},
total_avg: {$avg: "$age"}
}
}
])
-
查询男生、女生人数,按人数升序
db.c1.aggregate([
{$group:{_id: "$sex",rs: {$sum: 1}}},
{$sort:{rs: -1}}
])
#####
自增id
#创建序列
db.counters.insert({_id:"productid",sequence_value:0})
创建 Javascript 函数
现在,我们创建函数 getNextSequenceValue 来作为序列名的输入, 指定的序列会自动增长 1 并返回最新序列值。在本文的实例中序列名为 productid 。
>function getNextSequenceValue(sequenceName){
var sequenceDocument = db.counters.findAndModify(
{
query:{_id: sequenceName },
update: {$inc:{sequence_value:1}},
"new":true
});
return sequenceDocument.sequence_value;
}
使用 Javascript 函数
接下来我们将使用 getNextSequenceValue 函数创建一个新的文档, 并设置文档 _id 自动为返回的序列值:
>db.products.insert({
"_id":getNextSequenceValue("productid"),
"product_name":"Apple iPhone",
"category":"mobiles"})
>db.products.insert({
"_id":getNextSequenceValue("productid"),
"product_name":"Samsung S3",
"category":"mobiles"})
就如你所看到的,我们使用 getNextSequenceValue 函数来设置 _id 字段。
为了验证函数是否有效,我们可以使用以下命令读取文档:
>db.products.find()
以上命令将返回以下结果,我们发现 _id 字段是自增长的:
{ "_id" : 1, "product_name" : "Apple iPhone", "category" : "mobiles"}
{ "_id" : 2, "product_name" : "Samsung S3", "category" : "mobiles" }
事务
use test
db.createCollection("userinfo")
// 连接一个会话
s=db.getMongo().startSession()
// 开启事务
s.startTransaction()
// 操作
s.getDatabase("test").userinfo.insert({name:"a"})
// 提交成功 ,.如果这边不执行,则以上都不会执行
s.commitTransaction()
数据失效机制
mongodb失效的机制大概是这样的
为集合创建一个indexes(索引)
db.testCollection.ensureIndex( { "Date": 1 }, { expireAfterSeconds: 10 } )
然后确保每次插入数据的时候有该列,mongodb将会自动为你删除该列 db.testCollection.insert({"Date" : new Date(),"name":"zs","age":18})
设置的失效列必须为索引并且为日期格式
redis 和 mongodb区别:
1.redis值支持八种数据结构,mongodb只要是bson,就可以了
2.redis是纯内存,mongodb不是纯内存,都是分布式
3.redis不能写筛选,mongodb可以也条件查询,也支持聚合函数
4.redis可以设置过期,mongodb也可以
5.mongodb 像mysql,数据量大的时候,也可以创建索引
6.redis可以有事务,redis在集群下面,支持部分事务,部分指令,不 能有回滚,mongodb在集群下面有事务,能回滚
不能做到完全替换-- 都非常厉害,根据业务来选择