MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

comment implémenter la fonction comme jointure gauche de mysql dans mangouste

Ce que vous essayez de faire n'est pas possible car il n'y a pas d'instruction de jointure sur mongodb.

Vous pouvez y parvenir de deux manières :

1 - Par DBRefs : Changez votre schéma en un schéma qui inclut toutes les informations utilisateur et ne les divisez pas en deux schémas différents comme vous le faites, voir dénormalisé . Ensuite, vous pouvez utiliser la Population fonction pour obtenir toutes les données des personnes.

2 - Par références manuelles : La deuxième solution consiste à effectuer un deuxième appel à la base de données en obtenant les données personProfile en utilisant l'ID utilisateur comme filtre.

Exemple 1 :

De cette façon, vous pouvez obtenir toutes les données des personnes sans un deuxième appel à la base de données.

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
}

Notez que j'utilise le type Schema.Types.ObjectId et non le Numéro . De cette façon, vous pouvez attribuer une nouvelle valeur à _creator en passant soit le _id ou l'objet personne et la mangouste convertira l'objet en son _id. Par exemple, vous pouvez poster quelque chose comme

{
    _creator : {
        _id     : 123123123123,
        name    : 'Foo',
        birthday: '0000-00-00',
        profilelink: 'http://foo.bar',
        email: '[email protected]'
    },
    title    : 'Mr'
}

... et la mangouste se convertira en

{
    _creator : 123123123123,
    title    : 'Mr'
}

Exemple 2 :

De cette façon, vos données sont toujours normalisées et vous pouvez obtenir toutes les données des personnes avec un deuxième appel.

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
}