Ontwikkel een aangepaste MongoDB data validatie en schema afdwingingsstrategie
description
Met deze prompt kan de gebruiker sterke data validatie en schema afdwingingsstrategieën op maat van hun MongoDB collecties creëren, wat leidt tot betere data consistentie en het voorkomen van veelvoorkomende datakwaliteitsproblemen. Het biedt praktische aanbevelingen met gebruik van MongoDB’s ingebouwde validatiefuncties en ontwerp best practices, wat betrouwbaarheid verbetert ten opzichte van ad-hoc of ongestructureerde dataverwerking.
prompt
Help me bij het ontwikkelen van een aangepaste data validatie en schema afdwingingsstrategie voor mijn MongoDB collecties. Mijn huidige datamodellen zijn: <beschrijf je huidige datamodellen of collectie-structuren>. Ik wil aanbevelingen o ...
try_prompt
generate_helper
disclaimerOnPageApi
tags
ai_answers
provider: openai
model: gpt-4.1-nano
Natuurlijk! Hier zijn enkele aanbevelingen en best practices voor het opzetten van een robuuste data validatie- en schema-afdwingingsstrategie voor je MongoDB-collecties, gebaseerd op jouw datamodellen:
1. Validatieregels en schema-ontwerp
a. 'users' collectie:
- naam: verplicht, minimaal 1 teken, maximaal bijvoorbeeld 100 tekens.
- e-mail: verplicht, geldig email-formaat (gebruik regex of ingebouwde validators), uniek.
- registratieDatum: verplicht, moet niet in de toekomst liggen.
b. 'orders' collectie:
- producten: array van objecten met verplichte velden:
- productId: verplicht, verwijzing naar een product (bijvoorbeeld ObjectId).
- hoeveelheid: verplicht, minimaal 1.
- status: verplicht, met restrictieve waarden ('pending', 'shipped', 'delivered').
2. Best practices voor schema ontwerp
- Gebruik 'referentie- of embedded' patronen afhankelijk van gebruiksscenario's. Bijvoorbeeld:
- 'users': eenvoudig, met unieke e-mail.
- 'orders': vaak met verwijzingen naar 'products' (via ObjectId), en mogelijk embedded productinformatie indien relevant.
- Voeg timestamps toe (createdAt, updatedAt) voor audit trails.
- Zorg voor consistent gebruik van datatypes en beperkingen.
3. Implementatie met MongoDB functies
a. JSON Schema validatie:
- Definieer validatieregels bij het aanmaken of wijzigen van collecties via 'validator' in 'collMod' of bij creatie.
- Voorbeeld voor 'users':
```json
{
"$jsonSchema": {
"bsonType": "object",
"required": ["naam", "e-mail", "registratieDatum"],
"properties": {
"naam": {
"bsonType": "string",
"minLength": 1,
"maxLength": 100
},
"e-mail": {
"bsonType": "string",
"pattern": "^[^@\\s]+@[^@\\s]+\\.[^@\\s]+$"
},
"registratieDatum": {
"bsonType": "date",
"description": "moet een geldige datum zijn en mag niet in de toekomst liggen"
}
}
}
}
```
- Voor 'orders':
```json
{
"$jsonSchema": {
"bsonType": "object",
"required": ["producten", "status"],
"properties": {
"producten": {
"bsonType": "array",
"items": {
"bsonType": "object",
"required": ["productId", "hoeveelheid"],
"properties": {
"productId": {
"bsonType": "objectId"
},
"hoeveelheid": {
"bsonType": "int",
"minimum": 1
}
}
}
},
"status": {
"bsonType": "string",
"enum": ["pending", "shipped", "delivered"]
}
}
}
}
```
b. Applicatieniveau controles:
- Controleer validiteit vóór het opslaan (bijvoorbeeld met een server-side validatie).
- Zorg dat e-mailadressen uniek zijn door een unieke index te definiëren.
- Verifieer dat 'status' alleen de toegestane waarden bevat voordat je het document opslaat.
4. Data-integriteit en foutpreventie
- Gebruik unieke indexes voor velden zoals e-mail.
- Valideer inkomende data aan de client- of serverzijde.
- Implementeer transactie- of rollback-Mechanismen bij complexe operaties.
- Registreer en monitor foutmeldingen en validatiefouten.
5. Aanvullende tips
- Overweeg het gebruik van schema-validators in de MongoDB Atlas UI of via CLI.
- Documenteer je validatieregels en schema's goed voor team- en onderhoudsdoeleinden.
- Test je validaties grondig met verschillende scenario's om onverwachte fouten te voorkomen.
Wil je hulp met concrete codevoorbeelden of het opzetten van schema's in jouw omgeving?
provider: deepseek
model: deepseek-chat
Zeker, ik help je graag met het ontwikkelen van een robuuste data validatiestrategie voor je MongoDB collecties. Hier zijn gedetailleerde aanbevelingen voor zowel de `users` als `orders` collectie:
## 1. Users Collectie Validatie
### JSON Schema Validatie:
```javascript
db.createCollection("users", {
validator: {
$jsonSchema: {
bsonType: "object",
required: ["naam", "e-mail", "registratieDatum"],
properties: {
naam: {
bsonType: "string",
description: "Moet een string zijn en minimaal 2 karakters bevatten",
minLength: 2,
maxLength: 100
},
e-mail: {
bsonType: "string",
description: "Moet een geldig e-mail formaat hebben",
pattern: "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$"
},
registratieDatum: {
bsonType: "date",
description: "Moet een geldige datum zijn"
}
}
}
},
validationLevel: "strict",
validationAction: "error"
});
```
## 2. Orders Collectie Validatie
### JSON Schema Validatie:
```javascript
db.createCollection("orders", {
validator: {
$jsonSchema: {
bsonType: "object",
required: ["producten", "status"],
properties: {
producten: {
bsonType: "array",
description: "Array van producten met productId en hoeveelheid",
minItems: 1,
items: {
bsonType: "object",
required: ["productId", "hoeveelheid"],
properties: {
productId: {
bsonType: "string",
description: "Moet een geldige product ID zijn",
pattern: "^[a-f\\d]{24}$" // MongoDB ObjectId pattern
},
hoeveelheid: {
bsonType: "int",
description: "Hoeveelheid moet een positief geheel getal zijn",
minimum: 1,
maximum: 1000
}
}
}
},
status: {
bsonType: "string",
description: "Moet een van de toegestane statuswaarden zijn",
enum: ["pending", "shipped", "delivered"]
},
klantId: {
bsonType: "string",
description: "Optioneel: referentie naar users collectie",
pattern: "^[a-f\\d]{24}$"
}
}
}
}
});
```
## 3. Best Practices & Aanvullende Maatregelen
### Indexering voor Prestaties:
```javascript
// Users collectie indexes
db.users.createIndex({ "e-mail": 1 }, { unique: true });
db.users.createIndex({ "registratieDatum": -1 });
// Orders collectie indexes
db.orders.createIndex({ "status": 1 });
db.orders.createIndex({ "klantId": 1 });
db.orders.createIndex({ "producten.productId": 1 });
```
### Applicatieniveau Validatie (Node.js voorbeeld):
```javascript
// Users validatie
const validateUser = (userData) => {
const errors = [];
if (!userData.naam || userData.naam.length < 2) {
errors.push("Naam moet minimaal 2 karakters bevatten");
}
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
if (!emailRegex.test(userData.email)) {
errors.push("Ongeldig e-mail formaat");
}
if (!userData.registratieDatum || !(userData.registratieDatum instanceof Date)) {
errors.push("Ongeldige registratiedatum");
}
return errors;
};
// Orders validatie
const validateOrder = (orderData) => {
const errors = [];
if (!Array.isArray(orderData.producten) || orderData.producten.length === 0) {
errors.push("Order moet minimaal één product bevatten");
}
const validStatuses = ['pending', 'shipped', 'delivered'];
if (!validStatuses.includes(orderData.status)) {
errors.push(`Status moet een van de volgende zijn: ${validStatuses.join(', ')}`);
}
orderData.producten.forEach((product, index) => {
if (!product.productId || !/^[a-f\d]{24}$/.test(product.productId)) {
errors.push(`Product ${index + 1}: Ongeldige productId`);
}
if (!product.hoeveelheid || product.hoeveelheid < 1) {
errors.push(`Product ${index + 1}: Hoeveelheid moet minimaal 1 zijn`);
}
});
return errors;
};
```
## 4. Geavanceerde Validatie Regels
### Custom Validatie met MongoDB Aggregatie:
```javascript
// Voor orders: controleer of producten array niet leeg is
db.orders.updateOne(
{ _id: orderId },
[{ $set: {
isValid: {
$and: [
{ $gt: [{ $size: "$producten" }, 0] },
{ $in: ["$status", ["pending", "shipped", "delivered"]] }
]
}
}
}],
{ validation: true }
);
```
## 5. Migratie Strategie voor Bestaande Data
```javascript
// Controleer bestaande data voordat validatie wordt geactiveerd
const checkExistingUsers = db.users.find({
$or: [
{ naam: { $exists: false } },
{ e-mail: { $regex: /@.*\./ } }, // Eenvoudige e-mail check
{ registratieDatum: { $type: "date" } }
]
}).count();
if (checkExistingUsers > 0) {
console.log("Waarschuwing: Niet alle users voldoen aan de nieuwe validatie");
}
// Stapsgewijs activeren van validatie
db.runCommand({
collMod: "users",
validator: { $jsonSchema: {...} },
validationLevel: "moderate" // Alleen nieuwe/gewijzigde docs
});
```
## 6. Monitoring en Onderhoud
```javascript
// Monitor validatiefouten
db.setProfilingLevel(1, { slowms: 100 });
db.system.profile.find({ op: { $in: ["insert", "update"] } });
// Periodieke data health check
db.users.aggregate([
{ $match: {
$or: [
{ naam: { $not: { $regex: /^.{2,100}$/ } } },
{ e-mail: { $not: { $regex: /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/ } } }
]
}},
{ $count: "invalidDocuments" }
]);
```
## Belangrijkste Aanbevelingen:
1. **Gebruik JSON Schema** voor basisvalidatie op databaseniveau
2. **Implementeer applicatieniveau validatie** voor complexe bedrijfslogica
3. **Creëer unieke indexes** voor e-mailadressen om duplicaten te voorkomen
4. **Gebruik `validationLevel: "moderate"`** tijdens migratie
5. **Monitor validatiefouten** in productie
6. **Documenteer je validatieregels** voor het ontwikkelteam
Deze strategie combineert de kracht van MongoDB's ingebouwde validatie met robuuste applicatielogica voor optimale data-integriteit.