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 |