MongoDB数据库基础知识总结

MongoDB数据库基本概念

  1. 数据库(mongoDB)—>数据库(mysql)
  2. 集合(mongoDB)—>数据库表(mysql)
  3. 文档(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列:具体数据})
  }
)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值