2013-07-11 20 views
6

Ich lerne einen Knoten und habe versucht, Mungo zu verwenden. Derzeit ist mein Ziel zu lernen, wie man populate verwendet.Wie sollte ich richtig mit Mungo bevölkern?

Ich habe eine projects Definition und milestone erfordern:

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")(); 

Dann irgendwann ich tue dies in den projects.js:

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

Wie fülle ich die Meilensteine?


Hier wird die project Daten von Mongo sind:

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

Und dies ist die milestone, die im Grunde mit dem Projekt verbunden ist:

{ 
    "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 
} 

Auch dies ist das Meilenstein-Schema :

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); 

Antwort

11

Sie müssen die Reihenfolge der Definition von Abfrageoptionen erhalten, die dann ausgeführt wird, und kettenfähige APIs wie Mungo-Query können nicht wissen, welche zusätzlichen Methoden Sie nach dem Absetzen der Abfrage aufrufen könnten. Wenn Sie also den Rückruf an .find übergeben, sendet mongoose die Abfrage sofort.

einen Rückruf von Argumenten find
  • definiert
    • Abfrage find Pass da Rückruf ist, führt Abfrage sofort und gibt Befehl
    • dann .populate passiert mit DB, aber es hat keine Wirkung als Die Anfrage wurde bereits an mongo gesendet.

    Hier ist, was Sie tun müssen:

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

    oder ein wenig mehr lesbar:

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

    auslassen Rückruf und verwenden .exec

    • Abfrage .find geben erstellt Abfrageobjekt mit Parametern
    • zusätzliche verkettete Anrufe .sort , .populate etc weiter konfigurieren th e Abfrage
    • .exec sagt Ihnen, die Abfrage und Mungo Probleme der DB-Befehl fertig sind Mungo Konfiguration
    +0

    Ok, alle Dinge, die Sie absolut Sinn machen, schrieb. Das Schlimme ist, dass die Meilensteine ​​immer noch nicht bevölkert sind. Ich bekomme dort genau wie vorher eine leere Matrix. –

    +0

    Überprüfen Sie Ihre Daten doppelt? –

    +0

    Auch wenn Sie mehr Code veröffentlichen, können wir nach einfachen Tippfehlern und so weiter suchen. Der Teufel ist hier im Detail, da Mungo-Drähte all dies zusammenführen, basierend auf String-Namen mit verwirrenden Dingen wie Auto-Pluralisierung. Eine Sache in Kleinbuchstaben oder Singular falsch und Sie erhalten falsches Verhalten und keine Fehler. Von deinem Snippet sieht alles auf den ersten Blick gut aus. –

    Verwandte Themen