پایگاه داده — 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