MongoDB基础

认识MongoDB

  • 由c++编写,是一个基于分布式文件存储的开源数据库
  • 面向文档存储的数据库,操作很方便
MongoDB的优势
  • 易扩展:数据之间没有关系,比较容易扩展
  • 大数据量,高性能,数据库结构简单
  • 灵活的数据模型
安装

sudo apt-get install -y mongodb

启动
  • 启动:sudo service mongodb start
  • 停止:sudo service mongodb stop
  • 重启:sudo service mongodb restart
  • 默认:27017
客户端
  • 启动命令:mongo
  • 查看帮助:mongo -help
  • 退出:

将数据存储为一个文档,文档类似于json格式,字段值可以包含其他文档
{
name:“潘俊廷”,
‘age’:18,
‘address’:{city:‘长沙’,country:‘china’}
}

MongoDBMySQL
集合表table
文档
字段

一、库,集合的操作

1、查看所有库
  • show dbs
2、系统库介绍
  • admin root数据库
  • local 本地数据库,用来存储权限本身服务器的数据
  • config 用于分片设置
3、切换数据库
  • use dbname 有则使用,无则创建
  • 查看数据库的大学:db.stars()
  • 删除数据库:db.dropDatabase()
3、集合操作
  • 创建集合:db.createCollection(name,options)

  • 显示当前数据库的所有集合:show collections,show tables

  • 查看集合:db.name.find().pretty()

  • 删除集合:db.name.drop()

注意大小写
集合只有插入内容后才会被创建

二、 文档操作

每条数据就是一document,一条json数据

插入数据
# 插入数据
db.student.insert({
		'name':'panjunting',
		'age':18,
		'sex':'male',
		'course':['db','django','spider']
	}]

# 自定义id插入
db.student.insert({
		'_id':2,
		'name':'panjunting',
		'age':18,
		'sex':'male',
		'course':['db','django','spider']
	}]

# 插入多条数据
db.student.insertMany([
		{'name':'zhangsan','age':38,'sex':'man'},
		{'name':'lisi','age':33},
		{'name':'wangwu','age':3}
	])

# 先写字典再插入数据
data_info = {
		name:'xiaoming'.
		age:12,
		sex:'male',
		height:1.92
	}
db.second.insert(data_info)
查询数据
# 查询数据
db.student.find({'name':'zhangsan'})   查询满足条件的数据
select * from student where name="zhangsan"

# 年龄小于20岁
db.student.find({'age':{$lt:20}})  

#  年龄大于20岁
db.student.find({
		$where.function(){
			return this.age>20;
		}
	})				          

# 
db.student.find({'age':{$gt:16}$for:[{'course':'db'},{'sex':'man'}]})

# 查询结果显示
# 排序,sort,-1为降序,1为升序

# 年龄降序排列
db.student.find().sort({'age':-1})

# skip跳过几个显示
# limit允许显示几个
# 跳过一条数据显示两条数据
db.student.find().skip(1).limit(2)

# 查询条件
$lt : 小于
$gt :大于
$ne :不等于
$gte :大于等于
$lte :小于等于
修改数据

# 修改操作
query:update(查询条件)

# 修改‘zhangsan’为‘haha’
db.student.update({'name':'zhangsan'},{$set:{'name':'haha'}})

# 修改‘zhangsan’的年龄为40
db.student.update({'name':'zhangsan'},{$set:{'age':40}})
删除数据

# 删除
db.collection.remove(
<query>,		# 匹配,删除文档的条件
<justone>     #指定为TRUE,只删除一个文档
)		

db.student.remove({'name':'lisi'})

# remove方法过时了,推荐使用deleteone()或者deleteMany()方法
db.student.deleteOne({'name':'dema'})
db.student.deleteMany({'age':38})

三、分组聚合

聚合是基于数据的聚合管道,每个文档由一个或多个阶段组成的管道,可以对每个阶段进行分组/过滤等功能

  • _id表示分组依据,按照哪个字段进行分组
# 语法  db.dbname.aggregate({管道:{表达式}})

$group  将集合中的文档分组,可以统计结果
$match  过滤数据,只输出符合条件的文档
$sort   排序
$limit  限制返回的文档数
$skip   跳过指定数量的文档,返回余下的文档

# 表达式
$sum		计算总和
$avg		计算平均值
$min		最小值
$max		最大值
$push		在结果文档里插入值的数组中

案例


# 案例:统计学生平均年龄
db.stu.aggregate(
	[{$group:{
		_id:null,
		avg_age:{$avg:'$age'}		统计age字段的平均值
		}
	}]
(

# _id表示分组依据,按照哪个字段进行分组

# 案例:学生最大年龄
db.stu.aggregate(
	[{$group:{
		_id:null,		表示不指定分组字段,即统计整个文档
		max_age:{$max:'$age'}
		}
	}]
(

# 按字段'name'分组
db.stu.aggregate(
	[{$group:{
		_id:'name',
		couter:{$sum:1}    表示把每条数据作为1进行统计
		}
	}]
(

# 统计姓名
db.stu.aggregate(
	[{$group:{
		_id:null,
		name:{$push:'$name'}   
		}
	}]
(

# 取出年龄大于20的学生
db.stu.aggregate(
	$match:{age:{$gt:20}
})

四、python操作MongoDB

MongoDB索引操作
# 批量创建2000条数据
for (var index = 0; index < 2000;index++){
	db.abcd.insert({
		_id:index,
		name:'name'+index,
		age:index
		})
	}
# 统计数量
db.abcd.find().count()  
# 显示最后一条数据
db.abcd.find().skip(1999)
# 显示数据详情
db.abcd.find().explain('executionStats')
# 查看索引
db.abcd.getIndexes()
# 删除索引
db.abcd.dropIndex('name_1')

db.time.getIndexes()

五、把MongoDB操作方法封装成类

from pymongo import MongoClient

class MongoData(object):

    def __init__(self):
        self.client = MongoClient(host='127.0.0.1',port=27017)
        self.db = self.client['students']
        self.tab = self.db['tea']

    def insert_many(self,dict_list):
        res = self.tab.insert_many(dict_list)
        return res

    def finds(self, data, **kwargs):
        res1 = self.tab.find()

    def deletes_one(self,data):
        re = self.tab.delete_one(data)
        return re.deleted_count

    def updates(self,sel_data,set_data):
        """修改一条数据"""
        res = self.tab.update_many(sel_data,set_data)
        return res


if __name__ == '__main__':
    mongos = MongoData()
    dict_data = [
        {'name':'Peter','age':29,'pro':'music'},
        {'name':'Steve','age':23,'pro':'math'},
        {'name':'Susan','age':22,'pro':'English'},
        {'name':'David','age':26,'pro':'Chinese'},
        {'name':'Angle','age':23,'pro':'piano'}
    ]
    mongos.insert_many(dict_data)
    mongos.updates({'name':'Peter'},{'$set':{'name':'monkey'}})
    mongos.finds({'name':'David'})   # 查询语句
基于python实现的粒子群的VRP(车辆配送路径规划)问题建模求解+源码+项目文档+算法解析,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用,详情见md文档 算法设计的关键在于如何向表现较好的个体学习,标准粒子群算法引入惯性因子w、自我认知因子c1、社会认知因子c2分别作为自身、当代最优解和历史最优解的权重,指导粒子速度和位置的更新,这在求解函数极值问题时比较容易实现,而在VRP问题上,速度位置的更新则难以直接采用加权的方式进行,一个常见的方法是采用基于遗传算法交叉算子的混合型粒子群算法进行求解,这里采用顺序交叉算子,对惯性因子w、自我认知因子c1、社会认知因子c2则以w/(w+c1+c2),c1/(w+c1+c2),c2/(w+c1+c2)的概率接受粒子本身、当前最优解、全局最优解交叉的父代之一(即按概率选择其中一个作为父代,不加权)。 算法设计的关键在于如何向表现较好的个体学习,标准粒子群算法引入惯性因子w、自我认知因子c1、社会认知因子c2分别作为自身、当代最优解和历史最优解的权重,指导粒子速度和位置的更新,这在求解函数极值问题时比较容易实现,而在VRP问题上,速度位置的更新则难以直接采用加权的方式进行,一个常见的方法是采用基于遗传算法交叉算子的混合型粒子群算法进行求解,这里采用顺序交叉算子,对惯性因子w、自我认知因子c1、社会认知因子c2则以w/(w+c1+c2),c1/(w+c1+c2),c2/(w+c1+c2)的概率接受粒子本身、当前最优解、全局最优解交叉的父代之一(即按概率选择其中一个作为父代,不加权)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值