Verweisen auf ein anderes Schema in Mongoose

104

Wenn ich zwei Schemata habe wie:

var userSchema = new Schema({
    twittername: String,
    twitterID: Number,
    displayName: String,
    profilePic: String,
});

var  User = mongoose.model('User') 

var postSchema = new Schema({
    name: String,
    postedBy: User,  //User Model Type
    dateCreated: Date,
    comments: [{body:"string", by: mongoose.Schema.Types.ObjectId}],
});

Ich habe versucht, sie wie im obigen Beispiel miteinander zu verbinden, konnte aber nicht herausfinden, wie es geht. Wenn ich so etwas tun könnte, würde es mir schließlich das Leben sehr leicht machen

var profilePic = Post.postedBy.profilePic
Gorkem Yurtseven
quelle

Antworten:

182

Es hört sich so an, als ob Sie nach der Methode zum Auffüllen suchen. Nehmen Sie zunächst eine kleine Änderung an Ihrem Post-Schema vor:

var postSchema = new Schema({
    name: String,
    postedBy: {type: mongoose.Schema.Types.ObjectId, ref: 'User'},
    dateCreated: Date,
    comments: [{body:"string", by: mongoose.Schema.Types.ObjectId}],
});

Dann machen Sie Ihr Modell:

var Post = mongoose.model('Post', postSchema);

Wenn Sie dann Ihre Abfrage stellen, können Sie Referenzen wie folgt ausfüllen:

Post.findOne({_id: 123})
.populate('postedBy')
.exec(function(err, post) {
    // do stuff with post
});
nicksweet
quelle
4
Wofür ist das Feld "ref"? Ich kann keine Dokumentation dazu finden.
K - Die Toxizität in SO nimmt zu.
3
@KarlMorrison ref Feld bedeutet, in welcher Sammlung die angegebene ID gesucht werden soll.
Ankur Verma
Was wäre der Unterschied zwischen populate und addToSet?
Winnemucca
1
Wo ist Referenz für by:Selectro
Muhammad Umer
1
@KarlMorrison Die Dokumente für "ref" sind in den Dokumenten für populate: mongoosejs.com/docs/populate.html
Jeffrey Martinez
19

Nachtrag: Niemand hat "Populate" erwähnt - es ist Ihre Zeit und Ihr Geld sehr wert, sich die Mongooses Populate-Methode anzusehen: Erklärt auch das Verweisen auf Querverweise

http://mongoosejs.com/docs/populate.html

fino
quelle
1

Späte Antwort, aber das Hinzufügen, dass Mungo auch das Konzept der Unterdokumente hat

Mit dieser Syntax sollten Sie in der Lage sein, auf Ihren userSchemaTyp zu verweisen postSchema:

var userSchema = new Schema({
    twittername: String,
    twitterID: Number,
    displayName: String,
    profilePic: String,
});

var postSchema = new Schema({
    name: String,
    postedBy: userSchema,
    dateCreated: Date,
    comments: [{body:"string", by: mongoose.Schema.Types.ObjectId}],
});

Beachten Sie das aktualisierte postedByFeld mit Typ userSchema.

Dadurch wird das Benutzerobjekt in den Beitrag eingebettet, und es wird eine zusätzliche Suche gespeichert, die mithilfe einer Referenz erforderlich ist. Manchmal ist dies vorzuziehen, manchmal ist die Ref / Populate-Route der richtige Weg. Hängt davon ab, was Ihre Anwendung tut.

D. Lowe
quelle