MongoDB数据库基本概念
- 数据库(mongoDB)—>数据库(mysql)
- 集合(mongoDB)—>数据库表(mysql)
- 文档(mongoDB)—>数据库表中的行(mysql)
CRUD
查询
#单个条件查询
db.集合名.find([{name:"xg"}])
#多个条件查询(and/or)
db.集合名.find(
{$and:[{"state1":11},{"state2":22}]}
)
增加
//插入多个
db.scf_template_excel.insert([
{name:"xj",age:12},
{name:"xg",age:11}
])
修改
//修改完只剩下name属性,第一个大括号确定修改哪一个,后一个大括号修改
db.scf_template_excel.update({name:"xg"},{name:"xg1"})
//只想改变其中几个列
db.scf_template_excel.update({name:"xgg"}, {$set:{name:"sgg"}})
//删除其中几个列
db.scf_template_excel.update({name:"xgg"}, {$unset:{address:"haerbin"}})
//update默认修改一行数据,想要修改多个可以使用updatemany或者配置update
//向文档中增加一个数组
db.scf_template_excel.update({name:"xgg"},{$set:{hobby:{cities:["haerbin","beijing"],movies:["sq","yl"]}}})
//向数组中增加一个元素
//注意:"hobby.movies"必须加双引号,可以使用是push,也可以使用addtoSet,区别在于push会加入重复数据
db.scf_template_excel.update({name:"xgg"}, {$push:{"hobby.movies":"kb"}})
删除
//基本不用
db.scf_template_excel.remove({name:"sgg"})
稍微复杂一点的查询
1.总数
db.集合名.find().count()
2.分页
//表示从第10个开始,要5个
db.集合名.find().skip(10).limit(5)
3 .常用的条件操作符
//(>) 大于 - $gt,(<) 小于 - $lt,(>=) 大于等于 - $gte,(<= ) 小于等于 - $lte
db.scf_template_excel.find({num:{$gt:500,$lt:510}})
聚合
表达式
表达式 | 描述 | 实例 | 解释 |
---|---|---|---|
$sum | 计算总和 | db.mycol.aggregate([{$group : {_id : “$by_user”, num_tutorial : {$sum : “$likes”}}}]) | aggregate表示聚合开始,通过by_user分组,计算likes的总和,记为num_tutorial |
$avg | 计算平均值 | db.mycol.aggregate([{$group : {_id : “$by_user”, num_tutorial : {$avg : “$likes”}}}]) | 同上 |
$min | 最小值 | db.mycol.aggregate([{$group : {_id : “$by_user”, num_tutorial : {$min : “$likes”}}}]) | |
$max | 最大值 | db.mycol.aggregate([{$group : {_id : “$by_user”, num_tutorial : {$max : “$likes”}}}]) | |
$push | 在结果文档中插入值到一个数组中 | db.scf_template_excel.update({name:“xgg”}, {$push:{“hobby.movies”:“kb”}}) | push会加入重复数据 |
$addToSet | 在结果文档中插入值到一个数组中,但不创建副本 | db.scf_template_excel.update({name:“xgg”}, {$addToSet:{“hobby.movies”:“kb”}}) | |
$first | 根据资源文档的排序获取第一个文档数据 | db.mycol.aggregate([{$group : {_id : “$by_user”, first_url : {$first : “$url”}}}]) | |
$last | 根据资源文档的排序获取最后一个文档数据 | db.mycol.aggregate([{$group : {_id : “$by_user”, last_url : {$last : “$url”}}}]) |
管道
1 .$project
//输出时只显示title,author,id这3个列
db.article.aggregate(
{ $project : {
title : 1 ,
author : 1 ,
}}
);
2 .$match
//类似于where的功能
db.articles.aggregate( [
{ $match : { score : { $gt : 70, $lte : 90 } } },
{ $group: { _id: null, count: { $sum: 1 } } }
] );
3 . $limit,$skip
//分页操作,从第十个开始,要5个
db.article.aggregate(
{ $skip: 10 },
{ $limit: 5 });
4 .$unwind
{
//现在有的数据
"_id" : ObjectId("5951c5de567ebff0d5011fba"),
"name" : "陈晓婵",
"address" : "北京朝阳区",
"weekday" : [
1,
2,
3
]
}
//使用聚合
db.集合名.aggregate(
[
{
$unwind:"$weekday"
}
]
)
//结果
/* 1 */
{
"_id" : ObjectId("5951c5de567ebff0d5011fba"),
"name" : "陈晓婵",
"address" : "北京朝阳区",
"weekday" : 1
}
/* 2 */
{
"_id" : ObjectId("5951c5de567ebff0d5011fba"),
"name" : "陈晓婵",
"address" : "北京朝阳区",
"weekday" : 2
}
/* 3 */
{
"_id" : ObjectId("5951c5de567ebff0d5011fba"),
"name" : "陈晓婵",
"address" : "北京朝阳区",
"weekday" : 3
}
5 .$group
//分组
db.集合名.aggregate([{$group : {_id : “$by_user”, num_tutorial : {$sum : “$likes”}}}])
6 .$sort
//排序
//1为递增,-1为递减
db.集合名.aggregate(
{ $match: { status: 'P' } },
{ $sort: { age : -1 } }
)
7 . $geoNear
//输出接近某一地理位置的有序文档
//新增数据
db.shop.insert({"loc": [10, 10]});
db.shop.insert({"loc": [11, 10]});
db.shop.insert({"loc": [10, 11]});
db.shop.insert({"loc": [12, 15]});
//添加索引(必须增加2D索引)
db.shop.createIndex({"loc": "2d"});
//使用$geoNear
db.shop.aggregate([
{"$geoNear": {
"near": [11, 12],
"distanceField": "loc",
"maxDistance": 1,
"num": 2,
"spherical": true
}}
]).pretty();
mongoDB存储复杂数据
1 . 1对1数据
//可以使用内嵌文档
db.wifeAndHan.insert(
[{
name:"huangrong",
han:{
name:"guojing"
}
}]
)
2 . 1对多数据
//新增的时候会自动增加_id
db.users.insert(
[
{name:"zbj"},
{name:"swk"}
]
)
db.orders.insert(
{
list:["苹果","香蕉"],
user_id:"users中的外键"
}
)
3 .多对多
//新增的时候会自动增加_id
db.users.insert(
[
{name:"zbj"},
{name:"swk"}
]
)
//只需要把1对多中的user_id从字符串换成数组
db.orders.insert(
{
list:["苹果","香蕉"],
user_id:["users中的外键","users中的外键"]
}
)
mongoDB连表查询
1 .使用聚合$lookup
2 . 示例
db."A表".aggregate([
{
"$lookup": { //通过loolup关联两个表,相当于left join
"from": "B表", //同一个数据库下需要被关联的集合名
"localField": "A_id", //A表需要关联的键
"foreignField": "B_id", //B表需要关联的键
"as": "B_list" //B表的别名,下面输出B表字段时用到
}
},
{
"$match": {
"A_id": '1' //查询条件,相当于where
}
},
{
"$project": { //决定要显示的字段,相当于select的作用
"name": 1,
"B_result": "$B_list.result"
}
}])
$lookup和left join基本一致,$look只是聚合框架的一个stage,在其前前后后,都可以嵌入到其他的聚合管道的命令
3 .如果两个表都有条件
SELECT * FROM A AS A
JOIN B AS B ON A.OrderId=B.OrderId
WHERE A.Name='xg'
AND B.title='kk'
db.A.aggregate([
{ $match: {Name:CSUUID("xg")}},
{ $lookup:
{
from: "B",
localField: "OrderId",
foreignField: "OrderId",
as: "inventory_docs"
}
},
{ $match : {"inventory_docs.title" :kk} }
])
索引
//索引
//创建
db.集合名.createIndex({列名:1})
//查询
db.集合名.getIndexes()
//删除
db.集合名.dropIndex("索引名")
//组合索引
db.集合名.createIndex({列名:1,列名:-1})
//唯一索引
db.集合名.createIndex({列名:1}, {unique:"列名"})
//分析索引
db.集合名.find({name:"aa"}).explain("excutionStats");
子查询
//一个简单的例子
db.表A.findOne(
{
"表A列":db.表B.find({表B列:具体数据})
}
)