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)
# 新增
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") # 倒序