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

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

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


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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.