1. 基础概念
-
MongoDB简介:
- MongoDB是一个基于文档的NoSQL数据库,具有高性能、高可用性和易扩展性。
- 数据存储在类似JSON的BSON格式中。
-
基本术语:
- Database(数据库): 集合的容器。
- Collection(集合): 文档的容器,类似于关系型数据库中的表。
- Document(文档): 数据的基本单元,类似于关系型数据库中的行。
2. 安装与设置
-
安装MongoDB:
- 官方安装指南
-
启动MongoDB服务:
- Windows:
mongod
- Mac/Linux:
sudo service mongod start
- Windows:
-
MongoDB Shell:
- 连接MongoDB实例:
mongo
- 连接MongoDB实例:
3. 基本操作
选择数据库:use share 选中share的数据库
创建集合
db.createCollection("news") 创建一个名字为news的集合
插入数据(文档) db.news.insertOne({ name: "Alice", age: 25, city: "New York" }) 像news这个集合中插入一条数据
查询文档:
查所有
db.news.find() 查找所有的文档
带条件
db.news.find({ age: 25 }) 带条件查找 查询年龄为25的这一条数据
db.news.find({ age: { $gt: 20 }) 查询年龄大于20岁的
db.news.find({age:{$gt:20}},{name:1,age:1,_id:0}) 查询年龄>20,且返回name,age字段,不返回_id字段
排序
db.news.find().sort({age:-1}) 按照年龄降序排序
db.news.find().sort({age:1}) 按照年龄升序
分页
跳过指定数量的文档
db.news.find().skip(10)
限制返回的文档数量
db.news.find().limit(5)
分页查询
db.news.find().skip(10).limit(5)
逻辑操作符
$and
:与
db.news.find({ $and: [ { age: { $gt: 20 } }, { age: { $lt: 30 } } ] }) 查询大于二十小于三十
$or
:或
db.news.find({ $or: [ { age: 25 }, { age: 30 } ] })
查询年龄是25跟30的那两条
$not
:非
db.myCollection.find({ age: { $not: { $gt: 20 } } })
数组操作符
$in
:在指定数组中
db.news.find({ age: { $in: [25, 30, 35] } })
$nin
:不在指定数组中
db.news.find({ age: { $nin: [20, 25, 30] } })
$all
:包含数组中的所有元素
db.news.find({ tags: { $all: ["red", "blue"] } })
更新文档
db.news.updateOne({ name: "Alice" }, { $set: { age: 26 } }) 更新语句用于在 news集合中查找
name
字段值为"Alice"
的文档,并将其age
字段更新为26
。如果文档中没有age
字段,则会添加这个字段。删除文档
db.news.deleteOne({ name: "Alice" }) 删除所有 name 字段为Alice的文档
4.Python整合mongdb
1.安装pymongdb
pip install pymongdb
2.连接
from mongdb import MongClient
client =MongClient("localhost", 27017)
db = client['mydatabase'] 选择名为mydatabase的数据库,没有则自动创建
# 选择集合(如果集合不存在,MongoDB会自动创建)
collection = db['mycollection']
3.就是做一些业务操作了,增删改,这举出一个分页查询的代码
@bp.route('/list', methods=['GET'])
def list_documents():
try:
# 获取分页参数
page = int(request.args.get('page', 1))
per_page = int(request.args.get('per_page', 40))
# 计算跳过的记录数量
skip = (page - 1) * per_page
# 获取集合
with get_mongo_db() as m_db:
collection = m_db.information
# 查询文档并排序
pipeline = [
{"$sort": {"publish_date": -1}},
{"$skip": skip},
{"$limit": per_page},
{"$project": {
"full_title": 1,
"report_type": 1,
"publish_date": 1,
"researcher": 1,
"detail_link": 1,
"_id": {"$toString": "$_id"}
}}
]
documents = collection.aggregate(pipeline)
# 将查询结果转换为列表
documents_list = list(documents)
# 获取总记录数
total_documents = collection.count_documents({})
# 计算总页数
total_pages = (total_documents + per_page - 1) // per_page
result = {
"documents": documents_list,
"page": page,
"per_page": per_page,
"total_pages": total_pages,
"total_documents": total_documents
}
return Success(message="查询列表成功", result=result)
except Exception as e:
logger.error(e)
return Fail('查询失败')
然后这里普及一下我踩的坑吧,
1.在插入数据的时候,会自动生成一个_id的对象,这是mongdb自动生成,且是唯一的,如果你
from bson improt Objectid
Objectid(id)
利用这个把前端传的字符串id对象转为Objectid,这样才好去查询
如果是返回的话,直接下面这样操作
document['_id'] = str(document['_id'])