To, co próbujesz zrobić, nie jest możliwe, ponieważ na mongodb nie ma oświadczenia dołączającego.
Możesz to osiągnąć na dwa sposoby:
1 - Według DBRefs: Zmiana schematu na taki, który zawiera wszystkie informacje o użytkowniku i nie dzieli ich na dwa różne schematy, jak to robisz, zobacz zdenormalizowany . Następnie możesz użyć Populacja funkcja, aby uzyskać wszystkie dane osób.
2 - Według odniesień ręcznych: Drugim rozwiązaniem jest wykonanie drugiego wywołania bazy danych, pobierając dane personProfile przy użyciu identyfikatora użytkownika jako filtra.
Przykład 1:
W ten sposób możesz uzyskać wszystkie dane osób bez drugiego wywołania bazy danych.
var personSchema = Schema({
_id : Number,
name : String,
birthday: Date,
profilelink: String,
email: String
});
var storySchema = Schema({
_creator : { type : Schema.Types.ObjectId, ref: 'Person' },
title : String
});
Story
.find()
.populate(['_creator'])
.exec(function(err, stories) {
//do your stuff here
}
Zauważ, że używam typu Schema.Types.ObjectId a nie liczba . W ten sposób możesz przypisać nową wartość do _creator przekazując _id lub obiekt osoby a mangusta przekonwertuje obiekt na jego _id. Na przykład możesz opublikować coś takiego jak
{
_creator : {
_id : 123123123123,
name : 'Foo',
birthday: '0000-00-00',
profilelink: 'http://foo.bar',
email: '[email protected]'
},
title : 'Mr'
}
... a mangusta przekształci się w
{
_creator : 123123123123,
title : 'Mr'
}
Przykład 2:
W ten sposób Twoje dane są nadal znormalizowane i możesz uzyskać wszystkie dane osób za pomocą drugiego połączenia.
Story
.find()
.exec(function(err, stories) {
var arrayLength = stories.length;
for (var i = 0; i < arrayLength; i++) {
var story = stories[i];
personProfile.findById(story._creator, function (err, person) {
story._creator = person;
}
};
// do your stuff here
}