2013-01-30 12 views
9

Ich bin nicht sicher, wie das Beispielschema unten ausgefüllt wird oder ob es überhaupt möglich ist. Kann eine Referenz in einem Objekt wie unten sein? Wenn du kannst, wie würdest du es bevölkern? Z.B. .populate('map_data.location');?Mungo in einem Objekt bevölkern?

var sampleSchema = new Schema({ 
    name: String, 
    map_data: [{ 
    location: {type: Schema.Types.ObjectId, ref: 'location'}, 
    count: Number 
    }] 
}); 

Oder werde ich habe zwei separate Arrays für Standort haben und zählen etwa so:

// Locations and counts should act as one object. They should 
// Be synced together perfectly. E.g. locations[i] correlates to counts[i] 
locations: [{ type: Schema.Types.ObjectId, ref: 'location'}], 
counts: [Number] 

ich wie die erste Lösung fühlen würde das beste sein, aber ich bin mir nicht ganz sicher, wie man Lass es in Mongoose arbeiten.

Vielen Dank für jede Hilfe!

Antwort

14

Die erste Lösung ist möglich.

Mongoose hat derzeit Einschränkungen (see this ticket here) mehrere Ebenen von eingebetteten Dokumente bevölkern, aber ist sehr gut verstehen verschachtelte Pfade in einem einzigen Dokument - was Sie nach in diesem Fall sind.

Beispiel Syntax wäre:

YourSchema.find().populate('map_data.location').exec(...)

Andere Merkmale, wie Getter/Setter auf Wegen, orderBy Spezifizierungs und WHERE-Klauseln, etc. Auch eine verschachtelte Pfade annehmen, wie in diesem Beispiel von der docs:

Intern Mongoose teilt die Zeichenfolge an den Punkten und sortiert alles für Sie aus.

+0

Vielen Dank! –

+0

Soweit der zweite Punkt geht: Haben Sie ein Top-Element? Wenn ja, geben Sie eine Top-ID und eine Parent-ID an. Oder Abkömmlings-Array und ein Child-Array. Dann nimm alles von oben und sortiere die Vererbung auf der Clientseite aus. – Funkodebat

1

Die erste Option ist die beste. "count" ist Teil des Objekts "map_data".

4

Erste Option ist in Ordnung, aber wenn jemand Probleme mit dieser Abfrage map_data.location haben würde - Mongoose statt Objekt leer Array zurück - ich, dass dies funktionieren wird gefunden:

.populate({ 
    path: 'map_data.location', 
    model: 'Location' 
})