MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

wie man die Funktion wie left join von mysql in mongoose implementiert

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
}