数据库 — 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') 正则表达式搜索