【实战演练】使用MongoEngine进行MongoDB开发
发布时间: 2024-06-27 14:28:52 阅读量: 78 订阅数: 132 ![](https://csdnimg.cn/release/wenkucmsfe/public/img/col_vip.0fdee7e1.png)
![](https://csdnimg.cn/release/wenkucmsfe/public/img/col_vip.0fdee7e1.png)
![PDF](https://csdnimg.cn/release/download/static_files/pc/images/minetype/PDF.png)
Python利用ORM控制MongoDB(MongoEngine)的步骤全纪录
![【实战演练】使用MongoEngine进行MongoDB开发](https://img-blog.csdnimg.cn/direct/3e4865bec88b4e64acb9ba977b4b5ae6.png)
# 2.1 文档模型定义
MongoEngine 中的文档模型定义是使用类来完成的。类中的每个字段对应着文档中的一个字段,字段类型由 `Field` 类指定。
### 2.1.1 文档字段的定义和类型
```python
class User(Document):
name = StringField(max_length=100, required=True)
age = IntField(min_value=0, max_value=150)
email = EmailField(required=True)
```
* `StringField`:字符串类型字段,可指定最大长度和是否必填。
* `IntField`:整型字段,可指定最小值和最大值。
* `EmailField`:电子邮件地址类型字段,自动验证电子邮件格式。
### 2.1.2 文档关系的定义和查询
MongoEngine 支持定义文档之间的关系,例如一对一、一对多和多对多关系。
```python
class Order(Document):
user = ReferenceField(User) # 一对一关系
products = ListField(ReferenceField(Product)) # 一对多关系
```
查询文档关系时,可以使用 `populate()` 方法加载相关文档。
```python
order = Order.objects.get(id=1)
order.populate()
user = order.user
products = order.products
```
# 2. MongoEngine基础操作
### 2.1 文档模型定义
#### 2.1.1 文档字段的定义和类型
MongoEngine使用Python类来定义文档模型。每个类对应一个集合,类中的属性对应集合中的字段。字段的类型由`Field`类指定,提供了丰富的类型选择,包括:
```python
from mongoengine import *
class User(Document):
name = StringField(required=True, max_length=100)
age = IntField(required=True)
email = EmailField(required=True)
created_at = DateTimeField(default=datetime.utcnow)
```
- `StringField`:字符串类型,可指定最大长度。
- `IntField`:整数类型。
- `EmailField`:验证电子邮件地址的字符串类型。
- `DateTimeField`:日期时间类型,默认值为当前UTC时间。
#### 2.1.2 文档关系的定义和查询
MongoEngine支持文档之间的关系,通过`ReferenceField`和`EmbeddedDocumentField`实现。
- `ReferenceField`:一对一或一对多关系,引用另一个文档。
- `EmbeddedDocumentField`:嵌入式文档,将另一个文档嵌入到当前文档中。
```python
class Order(Document):
user = ReferenceField(User) # 一对一关系,引用User文档
items = ListField(EmbeddedDocumentField('Item')) # 一对多关系,嵌入Item文档列表
```
### 2.2 文档操作
#### 2.2.1 文档的创建和保存
创建文档并保存到数据库:
```python
user = User(name='John Doe', age=30, email='john.doe@example.com')
user.save() # 保存到数据库
```
#### 2.2.2 文档的查询和更新
查询文档:
```python
users = User.objects(name='John Doe') # 查询name为'John Doe'的用户
```
更新文档:
```python
user = User.objects(name='John Doe').first() # 获取第一个匹配的用户
user.age = 31
user.save() # 更新数据库中的文档
```
#### 2.2.3 文档的删除和计数
删除文档:
```python
user.delete() # 删除当前文档
```
统计文档数量:
```python
count = User.objects.count() # 统计User文档的数量
```
# 3.1 复杂查询
在 MongoDB 中,查询操作是数据检索的核心功能。MongoEngine 提供了丰富的查询方法,可以满足各种复杂查询需求。
#### 3.1.1 过滤条件的组合和嵌套
MongoEngine 支持使用 `Q` 对象组合和嵌套过滤条件。`Q` 对象可以表示各种比较运算符(如 `==`、`!=`、`>`、`<`)、逻辑运算符(如 `AND`、`OR`、`NOT`)和正则表达式匹配。
```python
from mongoengine import Q
# 查询年龄大于 18 且性别为男性的用户
users = User.objects(Q(age__gt=18) & Q(gender='male'))
```
#### 3.1.2 排序、分页和投影
除了过滤条件外,MongoEngine 还支持对查询结果进行排序、分页和投影。
* **排序:** 使用 `order_by` 方法对结果按指定字段进行排序。
* **分页:** 使用 `skip` 和 `limit` 方法对结果进行分页。
* **投影:** 使用 `project` 方法指定要返回的字段,以减少结果集的大小。
```python
# 查询年龄大于 18 的用户,按年龄降序排列,只返回姓名和年龄字段
users = User.objects(age__gt=18).order_by('-age').project(name=1, age=1)
```
### 3.2 聚合操作
聚合操作是 MongoDB 中一种强大的功能,用于处理和
0
0
相关推荐
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![docx](https://img-home.csdnimg.cn/images/20241231044901.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)