2013-07-11 16 views
6

Sto imparando qualche nodo e sto cercando di usare mangusta. Attualmente, il mio obiettivo è imparare a usare populate.Come dovrei usare correttamente popola con mangusta?

ho una definizione projects e milestone richiedono:

projectSchema = new mongoose.Schema({ 
    id: String, 
    title: String, 
    description: String, 
    owner: String, 
    site: String, 
    creation_date: Date, 
    milestone_ids: Array, 
    milestones: [{ 
     type: mongoose.Schema.Types.ObjectId, 
     ref: "Milestone" 
    }] 
}) 

Project = mongoose.model("Project", projectSchema) 
milestones = require(__dirname + "/milestones.js")(); 

poi faccio questo ad un certo punto della projects.js:

Project.find(query, {}, {sort: {_id: -1}}, 
    function (error, results) { 
     callback(results); 
    } 
).populate("milestones"); 

Come si popolano le tappe?


Ecco i dati project da mongo:

{ 
    "title": "sitename", 
    "description": "online thing", 
    "creation_date": { 
     "$date": "2013-07-11T19:45:42.139Z" 
    }, 
    "_id": { 
     "$oid": "51df0b66dbdd7c4f14000001" 
    }, 
    "milestones": [], 
    "milestone_ids": [], 
    "__v": 0 
} 

E questo è il milestone che è sostanzialmente connesso al progetto:

{ 
    "title": "Proof of concept", 
    "description": "Make it work.", 
    "due_date": { 
     "$date": "2013-07-11T19:46:38.535Z" 
    }, 
    "project_id": "51df0b66dbdd7c4f14000001", 
    "_id": { 
     "$oid": "51df0b9edbdd7c4f14000002" 
    }, 
    "__v": 0 
} 

Inoltre, questo è lo schema traguardo :

milestoneschema = new mongoose.Schema({ 
    id: String, 
    title: String, 
    description: String, 
    owner: String, 
    site: String, 
    due_date: Date, 
    project_id: { 
     type: String, 
     ref: "Project" 
    } 
}) 

Milestone = mongoose.model("Milestone", milestoneschema); 

risposta

11

È necessario ottenere l'ordine corretto per la definizione delle opzioni di query, quindi l'esecuzione e le API concatenabili come la query mangusta non possono sapere quali metodi aggiuntivi si potrebbero chiamare dopo l'attivazione della query. Quindi, quando si passa la richiamata a .find, mangusta invia immediatamente la richiesta.

passare un callback per find

  • query definita con argomenti a find
  • dal callback è lì, query viene eseguita immediatamente e le questioni comandare al DB
  • poi .populate accade, ma non ha alcun effetto la query è stata già inviata a mongo

Ecco cosa devi fare:

Project.find(query, {}, { 
    sort: { 
     _id: -1 
    } 
}).populate("milestones").exec(function (error, results) { 
    callback(results); 
}); 

o un po 'più leggibile:

Project 
    .find(query) 
    .sort('-_id') 
    .populate('milestones') 
    .exec(function(error, results) {     
     callback(results); 
    }); 

Omettere callback e utilizzare .exec

  • query passata al .find crea oggetto query con parametri
  • chiamate concatenate supplementari a .sort , .populate ecc. Configura ulteriormente th e interrogazione
  • .exec dice Mangusta aver terminato di configurare le questioni di query e Mongoose il comando DB
+0

Ok, tutte le cose che hai scritto perfettamente senso. La cosa brutta è che le pietre miliari non sono ancora popolate. Ho un array vuoto esattamente come prima. –

+0

Controlla bene i tuoi dati? –

+0

Anche se pubblichi più codice, possiamo cercare errori di battitura semplici e quant'altro. Il diavolo è nei dettagli qui come fili di mangusta tutto questo insieme basato su nomi di stringa con cose confondenti come l'auto-pluralizzazione. Una cosa in minuscolo o singolare in modo errato e si ottiene un comportamento errato e senza errori. Tuttavia, dal tuo frammento tutto sembra a prima vista. –