2013-10-28 16 views
20

Ich verstehe, wie man embed documents in Mongoose, und sie scheinen ziemlich einfach als Arrays, wenn die Speicherung, für die die Verwendung Fall ziemlich offensichtlich ist:Eingebettetes Dokument ohne Array?

var CommentSchema = new Mongoose.Schema({...}); 
var BlogPostSchema = new Mongoose.Schema({ 
    comments : [CommentSchema], 
}); 

Aber, was ich sehe nicht, wie nach einem Blick über zu tun In der Dokumentation vorwärts und rückwärts können Sie ein einzelnes Unterdokument speichern, das nicht in einem Array enthalten sein muss.

var UserSchema = new Mongoose.Schema({...}); 
var BlogPostSchema = new Mongoose.Schema({ 
    author: ??? // 'UserSchema' and UserSchema do not work here. 
}); 

Gibt es eine Möglichkeit, dies zu tun? Ich möchte nicht nur die ObjectId speichern, sondern eine vollständige Kopie des Benutzerdatensatzes speichern, aber kein Array benötigen oder wollen.

+1

Sie können das tun seit Version 4.2.0 finden Sie http://mongoosejs.com/docs/subdocs.html#single-embedded – kba

Antwort

18

Sie können nicht Schema auf diese Weise einbinden, mit der Begründung, dass diese Kind-Dokumente mit vollen Dokumenten verwechselt werden würden, siehe this bug thread, wo es heißt:

der Grund, warum wir diese Unterstützung nicht hinzugefügt haben, in Die Vergangenheit ist b/c Dies lässt uns fragen, ob alle Pre-Hooks auf die gleiche Weise für das Pseudo-Kind-Dokument ausgeführt werden, und es impliziert, dass wir save() für dieses Kind aufrufen können.

Die Antwort hier ist, nicht das Schema, sondern nur die Definition zu teilen.

var userdef = { name: String }; 
var UserSchema = new Schema(userdef); 
var BlogPostSchema = new Schema({author: userdef}); 

Dies würde zu einem verschachtelten Benutzerobjekt führen, ohne das Schema tatsächlich zu verschachteln.

+0

Gibt es irgendwelche Konsequenzen daraus? Ich meine das Verschachteln des Objekts anstelle des Schemas? – scaryguy

1

Das bloße Teilen von Informationen unterstützt Validierungsblasen nicht. Und möglicherweise müssen Sie auch UserSchema validieren.

Stattdessen empfehle ich Array-Länge Validierung

author: {type:[UserSchema], validate: function (arr) { return arr.length == 1 }}, 
Verwandte Themen