首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 更多程式設計知識

Python mongoengine 操作 MongoDB 完整教學:文件定義、查詢、引用、嵌入與分頁

     編輯:更多程式設計知識

mongoengine 提供類 Django ORM 的文件模型介面操作 MongoDB。本文涵蓋安裝、連線、文件定義、CRUD、引用欄位、嵌入文件、時間區間查詢、分頁與原生查詢。

安裝與連線


pip install pymongo mongoengine

from mongoengine import *
from datetime import datetime
connect('blog')  # 本地預設連線
# connect('blog', host='192.168.3.1', username='root', password='1234')

文件定義


class Category(Document):
    name = StringField(max_length=30, required=True)
    artnum = IntField(default=0, required=True)
    date = DateTimeField(default=datetime.now, required=True)

class Post(Document):
    artid = IntField(required=True)
    title = StringField(max_length=100, required=True)
    content = StringField(required=True)
    author = ReferenceField('User')
    tags = ListField(StringField(max_length=20), required=True)
    category = ReferenceField(Category, required=True)
    comments = IntField(default=0, required=True)

基本 CRUD


# 新增
cat = Category(name="Linux")
cat.save()

# 查詢全部
cats = Category.objects.all()

# 條件查詢
cat = Category.objects(name="Python").first()
cat.name = "LinuxZen"
cat.update()

# 陣列欄位查詢(預設 in 語意)
posts = Post.objects(tags="coding")  # tags 包含 "coding"

引用欄位


cat = Category(name="Linux")
cat.save()
post = Post(title="LinuxZen", content="...", tags=["Linux"], category=cat)
post.save()

# 反向存取
cate = Post.objects.first().category
print(cate.name)  # Linux

# 依分類查文章
cat = Category.objects(name="Linux").first()
posts = Post.objects(category=cat)

嵌入文件


class Tag(EmbeddedDocument):
    name = StringField()
    date = DateTimeField(default=datetime.now)

class Post(Document):
    tags = ListField(EmbeddedDocumentField(Tag))

# 使用
tag = Tag(name="LinuxZen")
post = Post(tags=[tag])
post.tags.append(Tag(name="MySite"))
post.save()

時間區間查詢


start = datetime(year, month, 1)
if month == 12:
    end = datetime(year + 1, 1, 1)
else:
    end = datetime(year, month + 1, 1)
articles = Post.objects(date__gte=start, date__lt=end).order_by('-date')

分頁與切片


# limit/skip
User.objects[:5]           # 前 5 筆
User.objects[5:]           # 跳過 5 筆
User.objects[10:15]        # 第 11~15 筆

# 陣列欄位切片
Page.objects.fields(slice__comments=[5, 10])  # comments 第 6~15 項

原生查詢與原子更新


# 原生查詢
Page.objects(__raw__={'tags': 'coding'})

# $inc 原子增量
Page.objects(comments__by="joe").update(inc__votes=1)

# $set 原子設值
Page.objects(comments__by="joe").update(set__votes=1)

其他實用技巧


# 轉 dict
users_dict = User.objects().to_mongo()

# 排序
User.objects.order_by("date")   # 正序
User.objects.order_by("-date")  # 倒序
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved