MongoDB知识必备
一、MongoDB简介
MongoDB是一个基于分布式文件存储的非关系型数据库,用于存储大量数据。在MongoDB中,数据表叫集合,数据记录叫文档,集合包含文档,每个文档的大小和内容都可以不一样,这使得MongoDB非常灵活,可以适应实际的业务环境和需求,不像MySQL需要首先定义表结构字段,MongoDB可以动态添加字段。MongoDB也是互联网公司数据库使用率比较高的一个数据库。
1、MongoDB专业术语:
- _id
以ObjectId("5febdaec4747ad3af6c87d7b")为例
_id是每个文档都有的值,是文档的唯一标识,每个集合默认都会以_id创建索引。长度为24,存储长度为12个字节,由四部分组成一个_id。
0-3字节:代表时间戳(即:5febdaec)
4-6:代表主机的唯一标识符(即:4747ad)
7-8:代表进程id(即:3af6)
9-11:代表计数器(即:c87d7b) - 集合
MongoDB数据库文档的集合,相当于MySQL数据库的表,但是与之不同的是,MySQL的表需要预先创建并定义字段,而集合支持任意字段的文档存储,非常灵活。 - 文档
集合包含文档,指的是一条数据记录,每个文档的大小、字段都可以不一样,格式为json格式。 - 字段
MongoDB的字段指的是json文档的键/值对,可以有多个字段,也可以为空,相当于MySQL数据库中的列。 - 游标
游标是指向查询结果集的指针,用户可以遍历游标以检索结果。
2、MongoDB特点
- 面向文档,使用操作简单快捷
- 文档字段灵活,适应业务变化,开发效率高
- 4.0版本之前不支持事务
- 分布式存储,负载增大可以考虑分片存储
二、MongoDB数据库常用操作
1、索引创建
- 查看索引
db.col_name.getIndexes()
- 创建索引
语法: >db.collection.createIndex(keys, options) 语句: >db.student.createIndex({"sdt_no":-1}) # 1为指定按升序创建索引,-1为降序创建索引 复合索引创建 >db.student.createIndex({"name":1,"grade":1}) 当前数据比较多可以使用background后台创建索引 >db.student.createIndex({"name":1,"grade":1}, {"background": true}) 文档中没有extra_key的不会被索引 db.student.createIndex({"extra_key": 1}, {"sparse": true }
索引选项(蓝色背景标识为常用参数):
- 删除索引
删除集合student索引名为index_name的索引 db.student.dropIndex('index_name') 删除集合student所有索引 db.student.dropIndexes()
2、CURD操作
- 新增(insert)
语法:
db.collection.insert(document) # 插入一条记录
db.collection.insert([doc1,doc2]) # 插入多条记录
db.student.insert({"name":"李华","age":17,"score":98}) db.student.insert({"name":"王一","age":16,"score":88,"desc":"新生"}) 批量插入多条记录 db.student.insert([{"name":"李华","age":17,"score":98},{"name":"王一","age":16,"score":88,"desc":"新生"}])
- 修改(update)
语法:
db.collection.update(query, update, upsert, multi) # upsert表示数据不存在是否插入,默认为false不插入;multi表示多条记录更新,如果不写此标识表示只更新第一条记录
修改单条记录 db.student.update({"name":"李华"},{"$set":{"score":96}}) # 将name为李华记录的score值修改为96 insertOrUpdate 不存在则新建 db.student.update({"name":"张三"},{"$set":{"age":18,"score":78}},true)# 将name为张三记录的age值修改为18、score值修改为78,如果记录不存在则新建一条记录 批量修改多条记录 db.student.update({},{"$set":{"class":1}},false,true) # 将数据库中所有记录class都修改为1
- 删除(remove)
db.student.remove({"name":"李华"}) # 删除name为李华的记录
- 查询(find)
语法:db.collection.find(query, projection)
query:查询条件,非必填,不填默认返回所有记录
projection:查询时返回文档中所有键值,非必填
查询name为李华的记录,不显示_id字段 db.student.find({"name":"李华"},{"_id":0}) and查询 查询name为李华,age为18的记录 db.student.find({"name":"李华","age":18}) or查询 查询name为李华或age为18的记录 db.student.find({"$or": [{"name":"李华"}, {"age":18}]})
以下是MongoDB等于、大于、小于和RDBMS中where语句的比较:
使用pretty() 方便可以使返回数据更易读
- 聚合
聚合主要用于数据处理之后返回计算结果,比如分类计算、平均数之类计算。
语法:db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)统计student集合中各年龄段的人数,等同于sql语句select age, count(*) from student group by age db.student.aggregate([{"$group": {"_id": "$age", "num": {"$sum" : 1}}}])
除了sum表达式还有以下表达式:
三、MongoDB在Python中应用
通过pymongo对数据库进行连接,操作数据库数据记录。
import pymongo host = '127.0.0.1' port = 20217 db_name = 'user_info_test' db_user = 'user_info_test' password = 'user_info#20210801' # 连接数据库服务器,获取客户端对象 mongo_client = pymongo.MongoClient(host, port) # 获取数据库对象 db = mongo_client[db_name] # 另一种写法 db=mongo_client.student db.authenticate(db_user, password) # 获取集合对象 student_coll = db.student # 另一种写法 my_collection=db['myCollection'] # 批量插入新增数据记录 data = [{'name':'李华','age':18,'sex':'男','score':98},{'name':'王一','age':19,'sex':'男','score':100}] student_coll.insert(data) # 查询文档 cursor = student_coll.find() print(cursor.count()) # 获取文档个数 # 修改文档 student_coll.update({'name':'李华'},{'$set':{'score':88}}) # 删除文档 student_coll.remove({}) cursor = student_coll.find() print(cursor.count()) # 删除记录后文档数
运行结果 2 0