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
全部评论

相关推荐

起名字真难233:人家只有找猴子的预算,来个齐天大圣他们驾驭不住呀😂😂
点赞 评论 收藏
分享
虚闻松声:继续投吧。 简历没啥问题。很优秀。 拙见:自我评价没什么意义;试试转向Agent开发、大模型应用;别死磕传统Java开发。 免费修改简历,就业咨询,欢迎私信交流。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务