检测mongodb是否启动

from pymongo import MongoClient
try:
    with MongoClient("mongodb://127.0.0.1:27017", serverSelectionTimeoutMS=1000) as c:
        c.admin.command("ping")   # 真正发一次握手
    print("MongoDB 已启动")
except Exception:
    print("MongoDB 未启动")
    
######导入

from dotenv import load_dotenv
from urllib.parse import quote_plus
from pymongo import MongoClient
load_dotenv()
mongourl = "mongodb://{}:{}@{}:{}".format(
	quote_plus(os.getenv("mongodbuser")),
	quote_plus(os.getenv("mongodbpassword")),
	os.getenv("mongodbip"),
	os.getenv("mongodbport"),
)
mongodb_client = MongoClient(mongourl)

添加数据

from pymongo import MongoClient
URI = "mongodb://localhost:27017"   # 唯一需要的外部变量
# 1. 新增一条文档
with MongoClient(URI) as client:
    client["test"]["demo"].insert_one({"name": "张三", "age": 25})

# 2. 批量新增多条文档
with MongoClient(URI) as client:
    client["test"]["demo"].insert_many([
        {"name": "李四", "age": 30},
        {"name": "王五", "age": 28}
    ])

删除数据

from pymongo import MongoClient
URI = "mongodb://localhost:27017"   # 唯一需要的外部变量
# 3. 删除第一条 age=30 的文档
with MongoClient(URI) as client:
    client["test"]["demo"].delete_one({"age": 30})

# 4. 删除所有 age>=28 的文档
with MongoClient(URI) as client:
    client["test"]["demo"].delete_many({"age": {"$gte": 28}})

更新数据

from pymongo import MongoClient
URI = "mongodb://localhost:27017"   # 唯一需要的外部变量
# 5. 只改第一条 name=张三 的文档,把 age 改成 26
with MongoClient(URI) as client:
    client["test"]["demo"].update_one(
        {"name": "张三"},          # 匹配条件
        {"$set": {"age": 26}}      # 只改字段
    )

# 6. 批量改所有 age>=28 的文档,统一加 1 岁
with MongoClient(URI) as client:
    client["test"]["demo"].update_many(
        {"age": {"$gte": 28}},
        {"$inc": {"age": 1}}
    )
# 6. 没有就插入,有就更新
with MongoClient(URI) as client:
    client["test"]["demo"].update_one(
    {"name": "张三"},           # 查询条件
    {"$set": {"age": 28, "city": "北京"}},  # 要写入/更新的字段
    upsert=True                 # 关键:没有就插入
)

# 6. 没有就插入,有就跳过 limit可选,只数到指定条数就停(性能优化)
doc = {"name": "张三", "age": 28, "city": "北京"}
with MongoClient(URI) as client:
    if client["test"]["demo"].count_documents({"name": doc["name"]}, limit=1) == 0:
    col.insert_one(doc)   # 不存在才插入

查询数据

from pymongo import MongoClient
URI = "mongodb://localhost:27017"   # 唯一需要的外部变量

# 获取文档中status为失败的个数
with MongoClient(URI) as client:
    doc = client["test"]["demo"].count_documents({"status": "失败"})
    
with MongoClient(URI) as client:
    doc = client["test"]["demo"].find_one()
    print("任意文档:", doc)

# 8. 按条件查一条 name=张三 的文档
with MongoClient(URI) as client:
    doc = client["test"]["demo"].find_one({"name": "张三"})
    print("张三:", doc)

# 9. 按条件查多条 age>=26 的文档,并限制 10 条
with MongoClient(URI) as client:
    cursor = client["test"]["demo"].find({"age": {"$gte": 26}}).limit(10)
    for d in cursor:
        print("age>=26:", d)
        
# 10. 正则查 name 以“张”开头的文档
with MongoClient(URI) as client:
    cursor = client["test"]["demo"].find({"name": {"$regex": "^张"}})
    for d in cursor:
        print("姓张:", d)

# 11. 忽略大小写查 email 包含 "GMAIL" 的文档
with MongoClient(URI) as client:
    cursor = client["test"]["demo"].find(
        {"email": {"$regex": "gmail", "$options": "i"}}
    )
    for d in cursor:
        print("gmail 邮箱:", d)

限制查询方法

限制返回数据:5条

from pymongo import MongoClient

with MongoClient("mongodb://127.0.0.1:27017") as client:
    cursor = client["test"]["demo"].find({"age": {"$gte": 18}}).limit(5)
    for doc in cursor:
        print(doc)

排序(sort)+ 限制: 返回前三

from pymongo import ASCENDING, DESCENDING

with MongoClient("mongodb://127.0.0.1:27017") as client:
    cursor = (
        client["test"]["demo"]
        .find()
        .sort("age", DESCENDING)  # 按 age 降序
        .limit(3)
    )
    for doc in cursor:
        print(doc)

操作符

操作符 含义 示例代码(直接复制即用)
$regex 正则匹配,if "你好" in name {"name": {"$regex": "^张"}}
$regex if "你好" not in name {"name": {"$not": {"$regex": "你好"}}}
$eq 等于 {"age": {"$eq": 25}}
$ne 不等于 {"status": {"$ne": "deleted"}}
$gt 大于 {"score": {"$gt": 90}}
$gte 大于等于 {"age": {"$gte": 18}}
$lt 小于 {"price": {"$lt": 100}}
$lte 小于等于 {"qty": {"$lte": 5}}
$in 在列表内 {"color": {"$in": ["red", "blue"]}}
$nin 不在列表内 {"color": {"$nin": ["green", "yellow"]}}
$exists 字段存在 {"email": {"$exists": True}}
$size 数组长度 {"tags": {"$size": 3}}
$all 包含所有元素 {"tags": {"$all": ["hot", "new"]}}
$elemMatch 数组元素复合条件 {"scores": {"$elemMatch": {"$gte": 80, "$lt": 90}}}
$type 字段类型 {"field": {"$type": "string"}}
$mod 取模运算 {"num": {"$mod": [10, 0]}}
$where JavaScript 表达式 {"$where": "this.a > this.b"}
关系 写法 示例(直接复制)
AND(默认) 同一字典写多个键 {"age":{"$gte":18},"status":"ok"}
OR $or 数组包字典 {"$or":[{"age":{"$lt":18}},{"vip":true}]}
NOR 都不满足 {"$nor":[{"age":{"$lt":18}},{"vip":true}]}
嵌套 AND+OR 组合使用 {"$and":[{"status":"ok"},{"$or":[{"age":{"$gte":18}},{"vip":true}]}]}