MongoDB概念
版本:MongoDB shell version v4.4.6
| 关系型数据库 | MongoDB |
|---|---|
| 库 | 库【db】 |
| 表 | 集合【collection】 |
| 记录 | 文档【document】 |
| 列 | 字段【field】 |
| 主键 | _id |
MongoDB的特点
c++编写,分布式文件数据库,键值存储,易扩展
默认端口:27107
键值的值支持几乎所有的数据类型:数字,字符串,列表,时间,空null,字典
MongoDB的思想
使用了一个不存在的对象【即没有创建该对象时可直接用,当添加了数据就自动创建了】
MongoDB命令行操作
# 1. 连库# windows【将安装目录的bin路径添加到系统环境变量的path中】mongo# linuxmongodb://user_name:password@host/db_name# 2. 用户操作show users # 查看所有用户db.createUser({user:"username",pwd:"password",roles:[{role:"readWrite",db:"db_name1"},{role:"readWrite",db:"db_name2"}]})# 3. 库的操作use new_db_name # 建库show dbs # 查看所有库列表db # 查看当前操作的库名db.help() # 查看库支持的命令帮助信息use db_name && db.dropDatabase() # 删除指定库,先进入库,然后删# 4. 集合(表)的操作db.collection_name.help() # 查看集合支持的命令帮助信息use db_name && show tables # 查看该库下所有的表【也可以用命令show collections】use db_name && db.collection_name.insertOne({key:value}) # 【方式一】创建默认配置的表,插入数据就自动创建集合use db_name && db.createCollection(table_name,{capped:布尔是否创建固定大小集合,达到最大值,覆盖最早值,size:集合大小,单位字节,max: 允许存文档(数据行数)最大值}) # 【方式二】use db_name && db.collection_name.drop() # 删除指定库下的表use db_name && db.collection_name.remove({}) # 清空表数据# 5. 索引的管理【1表示按升序排列,-1按降序】# 查看索引db.collection_name.getIndexes()# 查看索引大小db.collection_name.totalIndexSize()# 删除集合中的所有索引db.collection_name.dropIndexes()# 删除指定索引db.collection_name.dropIndex("索引名")# 创建索引use db_name && db.collection_name.createIndex(# 关键字段,支持复合索引即联合索引{"field_name":1,"field_name2":-1},# 是否后台运行创建{"background":true},# 是否唯一索引,默认false{"unique":fale},# 指定索引的名字,默认系统创建{"name":"index_name"},# 设定集合数据插入后的有效期,单位秒,索引字段值需为new Date()类型,到有效期了,自动开线程去删除数据{"expireAfterSeconds":180}, # 数据插入后180自动删掉,此参数不支持复合索引)# 6. 文档的操作# 增db.table_name.insertOne({key:value})db.table_name.inserMany([{},{}])# 删db.table_name.deleteOne({key:value}) # 删除指定条件的文档db.table_name.deleteMany({}) # 删除所有文档,相当于清空表的数据db.table_name.deleteMany({key:value}) # 删除所有文档包含指定条件的所有文档数据# 改db.table_name.updateOne({"query_key":"query_v"},{"$set":{key:value}})db.table_name.updateMany({"query_key":"query_v"},{"$set":{key:value}})db.table_name.save({"_id":1111111,data_k:data_v}) # 替换含有_id数据,没有就新增,有则替换# 查db.table_name.find({条件},{要返回的键数据}).pretty() # pretty方法是为显示好看db.table_name.find({}) # 返回所有db.table_name.findOne() # 返回一条db.table_name.find({a:{"$gt":10000}}{b:{"$lte":20000},{"k1":1,"_id":0}) #【and】 同时满足a和b条件的数,只显示k1的数据db.table_name.find({"$or":[{c:"10000"},{d:"20000"}]}) # 【or】满足cd中的一个即可db.table_name.find({"a":15000,"$or":[{c:"10000"},{d:"20000"}]}) #【and + or】 满足a且cd中的一个即可# 聚合查【求最大,最小,分组平局等等】- 聚合关键字$sum$avg$max$min$first 获取排序结果的第一个文档$last$push 获取统计字段所有的值,放到一个列表中,结果返回$addToSet 同上,但不建立副本- 管道关键字【允许多个管道一起用,按顺序前面管道的结果,传到后面管道使用】$group 分组$sort 排序$project 修改文档结构输出,如增加或删除字段,类似finde里只显示特定字段$match 过滤符合条件的数据$limit 返回多少条数据$skip 匹配的结果从前开始跳过多少条后返回数据# 之所以用_id是需要该字段是自动叠加的# 求以a字段分组,各自的总数db.table_name.aggregate({"$group":{_id:"$a",自定义字段:{$sum:1}}})db.base_order.aggregate([{"$group":{_id:"$order_id",avg_count:{$avg:"$price"}}}])# 其中一行结果数据{ "_id" : "111112", "avg_count" : [ 10000, 20000, 15000, 10000, 20000, 15000 ] }db.base_order.aggregate([{"$group":{_id:"$order_id",avg_count:{$push:"$price"}}}])# 先获取价格大于10000小于等于40000的数据,然后以订单号分组,算出平均价格,然后从前到后过滤一条后,返回一条db.base_order.aggregate([{"$match":{"price":{"$gt":10000,"$lte":40000}}},{"$group":{"_id":"$order_id","total_price":{"$avg":"$price"}}},{"$skip":1},{"$limit":1}])
python操作mongodb
官方文档:https://pypi.org/project/pymongo/
#!/usr/bin/env python# -*- coding:utf-8 -*-# datetime:2021/5/27 0027 14:40import datetimeimport pymongo# 1.创建连接# 账户登录# client = pymongo.MongoClient("mongodb://python:123456@localhost:27017")# 无账密登录client = pymongo.MongoClient("mongodb://127.0.0.1:27017")# 获取MongoDB中所有的库名db_list = client.list_database_names() # ['admin', 'config', 'local', 'test']# 2.切换到指定库,可以是不存在的库,只要向其中插入了数据,就自动创建了库与集合(表)db = client.llb_orderprint(db.name) # 查看库名即集合名# 获取库中所有的集合名字tables = db.list_collection_names()print(tables)# 3. 切换到指定集合【表】table = db.base_orderprint(table.name)# 4. 增# 插入单条数据insert_obj = table.insert_one({"order_id": "111111","order_status": "20100","order_create_time": datetime.datetime.now()})print(insert_obj.inserted_id) # 返回插入数据的唯一主键,默认如果在数据中不指定_id时,系统自己创建唯一id# 插入多条数据insert_many_obj = table.insert_many([{"order_id": "111112","order_status": "20101","order_create_time": datetime.datetime.now() + datetime.timedelta(seconds=100)},{"_id": 2, # 自己指定_id"order_id": "111115","order_status": "20101","order_create_time": datetime.datetime.now() + datetime.timedelta(seconds=300)},])print(insert_many_obj.inserted_ids)# 5. 查# 查单条result_one = table.find_one()print(result_one)# 5.1 查所有的result_all = table.find()for i in result_all:print(i)# 只返回指定条数数据for i in table.find().limit(2):print("===>", i)# 5.2 查询指定字段的数据,前面为条件{},后面指定字段,{"order_id": 1, "_id": 0}中的1表示,显示该字段,0表示不显示该字段# 规则:在一个规则中,除了_id可以0或1,其它字段不能同时出现0或1,要么全部1,要么全部0"""{"order_id": 1} 表示只显示_id和order_id字段{"order_id": 1, "_id": 0} 表示只显示order_id字段{"order_id": 1,"order_status":0,"_id": 0} 报错,不允许这样配置,想实现目的需要用下面的,显示的配置{"order_id": 1, "order_create_time": 1, "_id": 0}"""for i in table.find({}, {"order_id": 0, "order_create_time": 0}): #print(i)# 5.3 查询满足指定条件的数据for i in table.find({"order_status": "20102"}, {"_id": 0, "order_id": 1}):print(i)# 5.4 正则匹配for i in table.find({"order_id": {"$regex": "2$"}}):print(i)# 6. 改# 6.1 改单条table.update_one({"order_id": "111112"}, {"$set": {"order_status": "10000"}})# 6.2 改多条table.update_many({}, {"$set": {"order_status": "20000"}})# 7. 删# 7.1 删单条ret = table.delete_one({"order_id": "111111"})print(ret.deleted_count)# 7.2 删多条ret = table.delete_many({"order_status": "20000"})print(ret.deleted_count) # 返回删除的数量# 7.3 删除所有数据(文档)table.delete_many({})# 7.4 删除集合(表)table.drop()# 7.5 删除库db.dropDatabase()# 8 排序 1升序,-1降序,默认升序for i in table.find().sort("order_id", -1):print("---->:::", i)######### 9 $符的使用 ########$inc【自增】$push【向列表尾部插入】$pull【从列表中获取指定元素,原列表改变,相当于删除】$pop 【指定列表元素索引位置删除某个元素】# $set : 将name为test的文档【记录】中的字段order_list列表值中的索引位置为0的元素改为100,如果索引位置没有,就在该位置插入数据table.update_one({"name": "test"}, {"$set": {"order_list.0": 100}})# $ 代表的是下标 : 将字段order_list列表中元素22改为999table.update_one({"order_list": 22}, {"$set": {"order_list.$": 999}})# 向所有文档中插入一个新字段table.update_many({}, {"$set": {"inset_new_col": "use_python"}})# 删除所有文档中的某个字段table.update_many({}, {"$unset": {"inset_new_col": "use_python"}})
文章转载自Python小白养成记,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




