Was Sie versuchen, ist nicht möglich, da es keine Join-Anweisung auf Mongodb gibt.
Sie können dies auf zwei Arten erreichen:
1 - Durch DBRefs: Ändern Sie Ihr Schema in eines, das alle Benutzerinformationen enthält und sie nicht in zwei verschiedene Schemas aufteilt, wie Sie es tun, siehe denormalisiert . Dann können Sie die Bevölkerung verwenden Funktion, um alle Personendaten zu erhalten.
2 - Durch manuelle Referenzen: Die zweite Lösung besteht darin, einen zweiten Aufruf an die Datenbank zu richten, um die personProfile-Daten abzurufen, wobei die Benutzer-ID als Filter verwendet wird.
Beispiel 1:
So erhalten Sie alle Personendaten ohne erneuten Aufruf der Datenbank.
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
}
Beachten Sie, dass ich den Typ Schema.Types.ObjectId verwende und nicht die Nummer . Auf diese Weise können Sie _creator einen neuen Wert zuweisen Übergeben entweder der _id oder das Personenobjekt und der Mungo konvertiert das Objekt in seine _id. Sie können beispielsweise so etwas posten wie
{
_creator : {
_id : 123123123123,
name : 'Foo',
birthday: '0000-00-00',
profilelink: 'http://foo.bar',
email: '[email protected]'
},
title : 'Mr'
}
... und der Mungo konvertiert zu
{
_creator : 123123123123,
title : 'Mr'
}
Beispiel 2:
Auf diese Weise normalisieren sich Ihre Daten noch und Sie können alle Personendaten mit einem zweiten Anruf abrufen.
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
}