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_pageresult = {"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'])