利用pymongo进行MongoDB数据库的连接及查询操作
MongoDB是一款开源的面向文档型数据管理平台,其核心特征在于采用BSON(Binary JSON)这种二进制编码格式实现数据持久化存储。该系统凭借其高度灵活的数据架构设计、完备的查询操作体系以及优异的读写性能指标,在业界获得广泛应用认可。作为处于传统关系型数据库与新型非关系型数据库之间的过渡性产品,在NoSQL领域中展现出最为接近传统RDBMS的功能完备性与结构相似性特征。该系统基于使用C++编程语言开发完成,其设计目标是为Web应用程序构建具备可扩展性的高并发数据存储方案。在基础存储单位层面采用文档作为核心载体形式,此类文档本质上是由键值对构成的数据结构体,在形态上类似于传统关系型系统中的记录条目却具有更优的弹性特性。通过支持嵌套式文档对象、数组元素及复合类型等多样化数据形态组合方式,能够有效承载具有复杂层级关联特性的多维数据集
数据库连接技术实现
建立与数据存储系统的连接:
import pymongo
import re
from datetime import datetime
from dateutil.relativedelta import relativedelta
import matplotlib.pyplot as plt
client = pymongo.MongoClient('10.88.**.**', 27017)
# 账号密码认证,如果有
db = client.database # database数据库
db.authenticate("用户名", "密码")
对数据库中存储的各项信息内容进行详细检索与分析:
db=client['数据库名称']
collection = db.list_collection_names()
for i in collection:
print(i)
从数据库中选取一项数据检索操作:
collection=db['数据名称']
查询数据
通过调用find()函数实现数据检索操作:
# 示例查询条件
query = {"name": "John", "age": {"$gt": 30}}
# 使用find()方法和查询条件查询数据
for document in collection.find(query):
print(document)
采用聚合操作来执行数据库检索任务 依据特定条件对表格内的记录实施过滤处理 MongoDB所存储的数据属于非结构化类型 其存储形式基于键值对结构:
query={
"sex":0,
"age":15,
"name":"tom"
} # 筛选的条件
# 通过aggregate将符合条件数据的都存储在count中
count = collection.aggregate([
{"$match":query},
])
# 也可以统计符合条件的数据数量
count = collection.aggregate([
{"$match":query},
{“$count”:"total"}, # 将统计的数量都存储在total变量中
])
# 此时的count就成为了一个字典:{“total”:465445}
针对涉及部分数据值的查询请求,可运用基于正则表达式的匹配手段进行处理:
query={
"sex":0,
"age":15,
"name": {"$regex": "tom"} , # name中包含t、o、m字母组合的数据
"name": {"$regex": "^tom"}, # name中以tom开头的数据
"name": {"$regex": "tom$"}, # name中以tom结尾的数据
"name": {"$regex": "\ (tom\ )"}, # name中包含(tom)的数据,\ 是转义字符的意思
}
count = collection.aggregate([
{"$match":query},
])
此外还能够引入额外的字符筛选标准:
$lt(less than):适用于检索符合特定数值阈值的数据条目
query = {"age": {"$lt": 30}}
for document in collection.find(query):
print(document)
$gte(greater than or equal to):适用于筛选数据字段对应的数值不低于设定阈值的文档记录。
$lte(less than or equal to):适用于筛选数据字段对应的数值不高于设定阈值的文档记录。
$ne(not equal):适用于筛选数据字段对应的数值与设定基准存在差异性的文档记录。
query = {"name": {"$ne": "John"}}
for document in collection.find(query):
print(document)
$in :用于选择字段值在给定的数组中的文档。
$nin :与$in相反,用于选择字段值不在给定数组中的文档。
query = {"age": {"$nin": [25, 30, 35]}}
for document in collection.find(query):
print(document)
$exists :用于验证数据记录内是否包含特定属性项的操作定义
query = {"age": {"$exists": True}}
for document in collection.find(query):
print(document)
$type :旨在筛选字段值符合特定BSON类型的数据记录
query = {"name": {"$type": 2}} # 2 是字符串类型的BSON类型码
for document in collection.find(query):
print(document)
对数据集的整合可通过分类操作实现,在具体实施过程中可采用两种策略:其一为基于预设条件过滤后再实施分类处理;其二则可省略预处理环节直接执行分类操作,在代码层面只需对首行指令添加注释标记即可完成切换
count = collection.aggregate([
{"$match":query},
{"$group":{"name":"$name", # 按照name进行分组,第一个name是自己命名的,可以随便写,第二个name是数据中的name,以此为分组的依据
"sex":{"$first":"$sex"}, # 同时输出分组后第一条数据的sex
"age":{"$last":"$age"}, # 同时输出分组后最后一条数据的age
"sum":{"$sum":"$age"}, #求age的总和,平均值和最大最小值
"avg":{"$avg":"$age"},
"max":{"$max":"$age"},
"min":{"%min":"$age"},
}} # 最后的输出是个字典,包含这些key和对应的值,key名字可以自己取
])
此外,还可依据多个不同字段实施分类操作:
count = collection.aggregate([
{"$match":query},
{"$group":{"id":{"name":"$name",
"age":"$age",
"sex":"$sex"}, # 将按照name、age和sex三个字段来分组,每个不同的name、age和sex都会形成一个分组,key名叫id
}} # 最后的输出是个字典,包含这些key和对应的值,key名字可以自己取
])
$match :旨在筛选数据集中的记录项,并将符合特定条件的数据传递至后续处理环节。此机制有助于提升整个流程效率,通过前置过滤操作可有效缩减下游阶段需处理的数据量规模。
$group :实现对数据集合的归类整理功能,在汇总分析场景中具有广泛应用价值。该阶段通常包含若干个_id标识字段作为分类依据,并配合sum/avg等累积函数完成各分类单元的数据运算任务。
$project :负责重构输出数据的组织形式与字段构成体系。其核心功能涵盖新增衍生字段、剔除冗余属性、执行字段重命名操作以及基于表达式生成复合型计算字段等多样化数据加工行为。
$sort :实施全局排序机制并返回有序化数据流。该操作常被部署于聚合流程末尾位置,在实现结果排序需求的同时需注意其可能引发的性能损耗问题——尤其在面对海量数据集时表现更为显著。
$limit :设置聚合结果返回上限阈值的功能模块。该指令可应用于分页控制场景或仅提取前N项关键记录的操作需求中,在保证数据完整性的同时实现结果集规模的有效管控。
$skip :执行指定数量记录跳过操作的功能组件。通常与limit指令协同工作以构建完整的分页导航体系,在实现结果列表分段展示方面具有重要应用价值。
$unwind :针对数组类型字段实施解构重组的操作工具。通过将复合型数组元素转化为独立文档形式,为后续复杂数据分析提供基础支撑条件,在处理嵌套结构化数据时尤为关键。
$lookup :支持跨集合关联查询的核心功能模块(MongoDB3.2+)。该机制允许在聚合流水线中构建类似SQL JOIN的数据连接关系,在整合多源异构数据方面发挥着重要作用作用。
**bucket、bucketAuto **:这两类操作符专门用于创建区间划分型分类框架(bucket)与自动边界判定型分类框架(bucketAuto)。前者支持人工设定区间范围划分规则而后者则具备智能边界自适应调节能力,在统计数据分布特征时具有明显优势优势.
** $geoNear ** : 特殊空间查询专用阶段, 可计算并返回距离指定地理坐标点最近的一组文档实体, 在地理位置相关分析场景中发挥着不可替代的作用.
** $addFields ** : MongoDB4.2版本引入的新特性, 允许开发者直接向现有文档注入新属性字段或覆盖原有字段值, 相较于传统project方式无需显式声明保留其他原始字段即可完成更新.
