数据库 — MongoDB
Finch 通过 mongo_dart 包支持 MongoDB。连接通过 FinchDBConfig 配置,并通过 DBCollection 访问。
配置
FinchConfigs(
dbConfig: FinchDBConfig(
enable: true,
host: env['MONGODB_CONNECTION'] ?? 'localhost',
port: env['MONGODB_PORT'] ?? '27017',
user: env['MONGODB_USER'] ?? 'root',
pass: env['MONGODB_PASSWORD'] ?? 'password',
dbName: env['MONGODB_NAME'] ?? 'my_app',
auth: env['MONGODB_AUTH'] ?? 'admin',
),
)
DBCollection 模式
为每个 MongoDB 集合定义一个 DBCollection 单例:
// lib/db/db_collection.dart
import 'package:finch/finch_mongo_db.dart';
DBCollection usersCollection = DBCollection('users');
DBCollection productsCollection = DBCollection('products');
在整个应用程序中共享这些单例。
使用 DQ 进行查询
DQ(Database Query)是 Finch 中主要的 MongoDB 查询构建器。
查找文档
// 按过滤器查找
var users = await usersCollection.modernFind(
selector: DQ.filter({'isActive': true}),
limit: 20,
skip: 0,
);
// 按 ID 查找
var user = await usersCollection.modernFindOne(
selector: DQ.id(id),
);
// 复杂查询
var results = await usersCollection.modernFind(
selector: DQ.filter({
'age': DQ.gt(18),
'role': DQ.inList(['admin', 'editor']),
}),
sort: {'createdAt': -1},
limit: 10,
);
插入文档
await usersCollection.insertOne({
'name': 'Ali',
'email': '[email protected]',
'createdAt': DateTime.now(),
});
更新文档
await usersCollection.updateOne(
DQ.id(userId),
DQ.set({'lastLogin': DateTime.now()}),
);
删除文档
await usersCollection.deleteOne(DQ.id(userId));
ExampleModel 模式
创建模型来封装集合逻辑:
// lib/models/user_model.dart
import 'package:finch/finch_model.dart';
import '../db/db_collection.dart';
class UserModel extends FinchModel {
final DBCollection _collection = usersCollection;
Future<Map<String, dynamic>?> findByEmail(String email) async {
return await _collection.modernFindOne(
selector: DQ.filter({'email': email}),
);
}
Future<List<Map<String, dynamic>>> getActive({int limit = 20}) async {
return await _collection.modernFind(
selector: DQ.filter({'isActive': true}),
limit: limit,
sort: {'createdAt': -1},
);
}
Future<void> create(Map<String, dynamic> data) async {
data['createdAt'] = DateTime.now();
await _collection.insertOne(data);
}
}
DQ 操作
| 操作 | 代码 | 描述 |
|---|---|---|
| 过滤 | DQ.filter({'field': value}) |
简单等值过滤 |
| By ID | DQ.id(id) |
按 ObjectId 查找 |
| Set | DQ.set({'field': newValue}) |
更新字段 |
| GT/LT | DQ.gt(n) / DQ.lt(n) |
数值比较 |
| In 列表 | DQ.inList([...]) |
匹配提供的值 |
| Like | DQ.like('pattern') |
正则表达式搜索 |