پایگاه داده — MongoDB
فینچ از MongoDB از طریق پکیج mongo_dart پشتیبانی میکند. اتصال با 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) سازنده کوئری اصلی 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),
);
// یافتن با query پیچیده
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': 'علی',
'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 List | DQ.inList([...]) |
تطابق مقادیر ارائهشده |
| Like | DQ.like('pattern') |
جستجوی regex |