Archief - Mongoose - hoe dit modelleren?

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

Dieterg

Legacy Member
In mijn vrije tijd ben ik wat aan het spelen met Mongoose.
Ik ben een REST API aan het maken in NodeJS en heb wat vragen over het model dat ik nu heb.

Het model ziet er als volgt uit:
Code:
var mongoose = require('mongoose'),
    SharedPayment = new mongoose.Schema({
        description: String,
        issuedBy: String,
        amount: Number,
        category: String,
        amountSharedWith: Number
    }),
    Payment = new mongoose.Schema({
        description: String,
        place: String,
        issuedBy: String,
        paymentType: String,
        amount: Number,
        sharedPayments: [SharedPayment]
    });

module.exports = mongoose.model('Category', {
    qualifier: Number,
    name: String,
    amount: Number,
    payments: [Payment]
});

Ik heb weinig tot geen ervaring met Mongoose, is bovenstaand model correct gedefinieerd?

In mijn REST API heb ik vervolgens volgend endpoint gedefinieerd:

Code:
app.get('/api/categories', categoryController.all);

In mijn controller heb ik dan een functie om alle categorieën op te halen.
Het idee is dat je enkel de categorieën terug krijgt en niet de categorieën + betalingen.

Code:
Category.find({}, function(err, categories) {
   res.json(categories);
});

Bovenstaande functie haalt alle categorieën op en betalingen + eventuele gesharede betalingen.
Ik vind dit raar, waarom bestaat er dan zoiets als populate?

Ik zou denken dat als je de betalingen er bij wilt hebben dat je iets als volgt moet doen
Code:
Category.find().populate('payments').exec(function(err, categories){
   res.json(categories);
});

Dit geeft hetzelfde resultaat terug.. In beide gevallen krijg ik de betalingen er bij.
Ik heb dit als volgt opgelost:
Code:
Category.find().select('name qualifier').exec(function(err, categories){
   res.json(categories);
});
Is dit correct? Ik vraag mij af wat er achter de scherm gebeurd, worden de betalingen genegeerd in bovenstaande query?

Alvast bedankt om mij hier wat meer uitleg over te geven.

Moto

Legacy Member
Bovenstaande functie haalt alle categorieën op en betalingen + eventuele gesharede betalingen.
Ik vind dit raar, waarom bestaat er dan zoiets als populate?
raar? zo hoort het toch te werken? Category + Payment + SharedPayment zitten toch samen in 1 document in uw mongodb veronderstel ik

Category.find().populate('payments')
Tis geen relationele db, en het is geen EF :p


Is dit correct? Ik vraag mij af wat er achter de scherm gebeurd, worden de betalingen genegeerd in bovenstaande query?
Yep dit is correct
Mongodb heeft functionaliteit om enkel een bepaald aantal velden te includen of te excluden
Limit Fields to Return from a Query ? MongoDB Manual 2.6.3
Dat zal achter de schermen zo gebruikt worden

Dieterg

Legacy Member
Moto zei:
raar? zo hoort het toch te werken? Category + Payment + SharedPayment zitten toch samen in 1 document in uw mongodb veronderstel ik

Klopt :)

Moto zei:
Tis geen relationele db, en het is geen EF

Net daarom dat ik dacht dat je populate moest gebruiken om subdocuments op te halen. Als ik het goed begrijp wordt populate gebruikt om referenced documents op te halen.

Bedankt voor de informatie!

Moto

Legacy Member
Als ik het goed begrijp wordt populate gebruikt om referenced documents op te halen.
Yep, maar voor de kleine dingen die ik al gedaan heb met mongodb heb ik dat nog niet nodig gehad, ge moet echt werken met die subdocuments en u lekker voelen bij data dubbel hebben staan dat is geen probleem, zeker niet denken dat ge moet gaan normaliseren :)

heb u een berichtje gestuurd btw met nog wat meer info
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan