Odwoływanie się do innego schematu w Mongoose

104

jeśli mam dwa schematy takie jak:

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

Próbowałem połączyć je ze sobą, jak na powyższym przykładzie, ale nie mogłem wymyślić, jak to zrobić. W końcu, jeśli mogę zrobić coś takiego, bardzo ułatwiłoby mi to życie

var profilePic = Post.postedBy.profilePic
Gorkem Yurtseven
źródło

Odpowiedzi:

182

Wygląda na to, że metoda wypełniania jest tym, czego szukasz. Najpierw wprowadź niewielką zmianę w schemacie postów:

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

Następnie stwórz swój model:

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

Następnie, kiedy tworzysz zapytanie, możesz wypełnić odwołania w następujący sposób:

Post.findOne({_id: 123})
.populate('postedBy')
.exec(function(err, post) {
    // do stuff with post
});
nicksweet
źródło
4
Do czego służy pole „ref”? Nie mogę znaleźć dokumentacji na ten temat.
K - Toksyczność SO rośnie.
3
Pole @KarlMorrison ref oznacza, w której kolekcji będzie wyszukiwany podany identyfikator.
Ankur Verma
jaka byłaby różnica między populate a addToSet?
Winnemucca
1
gdzie jest odniesienie dla by:selectro
Muhammad Umer
1
@KarlMorrison Dokumentacja dla „ref” znajduje się w dokumentacji dla populate: mongoosejs.com/docs/populate.html
Jeffrey Martinez
19

Dodatek: Nikt nie wspomniał o „Wypełnianiu” - jest to bardzo warte poświęcenia czasu i pieniędzy, aby przyjrzeć się metodzie populacji mangusty: wyjaśniono również odsyłacze do dokumentów krzyżowych

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

fino
źródło
1

Późna odpowiedź, ale dodając, że Mongoose ma również koncepcję dokumentów podrzędnych

Dzięki tej składni powinieneś być w stanie odwołać się do swojego userSchematypu w swoim 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}],
});

Zwróć uwagę na zaktualizowane postedBypole z typem userSchema.

Spowoduje to osadzenie obiektu użytkownika w poście, zapisując dodatkowe wyszukiwanie wymagane przy użyciu odwołania. Czasami może to być lepsze, innym razem trasa ref / populate może być drogą do zrobienia. Zależy od tego, co robi Twoja aplikacja.

D. Lowe
źródło