Database — MongoDB

Finch ondersteunt MongoDB via het mongo_dart-pakket. De verbinding wordt geconfigureerd met FinchDBConfig en is beschikbaar via DBCollection.

Configuratie

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-patroon

Definieer voor elke MongoDB-collectie een DBCollection-singleton:

// lib/db/db_collection.dart
import 'package:finch/finch_mongo_db.dart';

DBCollection usersCollection    = DBCollection('users');
DBCollection productsCollection = DBCollection('products');

Deel deze singletons door de hele applicatie.

Queries met DQ

DQ (Database Query) is de primaire MongoDB-querybouwer in Finch.

Documenten opzoeken

// Opzoeken met filter
var users = await usersCollection.modernFind(
  selector: DQ.filter({'isActive': true}),
  limit: 20,
  skip: 0,
);

// Opzoeken op ID
var user = await usersCollection.modernFindOne(
  selector: DQ.id(id),
);

// Opzoeken met complexe query
var results = await usersCollection.modernFind(
  selector: DQ.filter({
    'age': DQ.gt(18),
    'role': DQ.inList(['admin', 'editor']),
  }),
  sort: {'createdAt': -1},
  limit: 10,
);

Documenten invoegen

await usersCollection.insertOne({
  'name': 'Ali',
  'email': '[email protected]',
  'createdAt': DateTime.now(),
});

Documenten bijwerken

await usersCollection.updateOne(
  DQ.id(userId),
  DQ.set({'lastLogin': DateTime.now()}),
);

Documenten verwijderen

await usersCollection.deleteOne(DQ.id(userId));

ExampleModel-patroon

Maak modellen om collectielogica in te kapselen:

// 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-operaties

Operatie Code Beschrijving
Filter DQ.filter({'field': value}) Eenvoudige gelijkheidsfilters
By ID DQ.id(id) Opzoeken op ObjectId
Set DQ.set({'field': newValue}) Velden bijwerken
GT/LT DQ.gt(n) / DQ.lt(n) Numerieke vergelijkingen
In lijst DQ.inList([...]) Opgegeven waarden matchen
Like DQ.like('pattern') Regex-zoekopdracht