MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

como implementar a função como left join do mysql no mangusto


O que você está tentando fazer não é possível porque não há instrução de junção no mongodb.

Você pode conseguir isso de duas maneiras:

1 - Por DBRefs: Alterando seu esquema para um que inclua todas as informações do usuário e não os divida em dois esquemas diferentes como você está fazendo, consulte desnormalizado . Então você pode usar a População função para obter todos os dados de pessoas.

2 - Por referências manuais: A segunda solução é fazer uma segunda chamada para o banco de dados obtendo os dados de personProfile usando o ID do usuário como filtro.

Exemplo 1:

Desta forma, você pode obter os dados de todas as pessoas sem uma segunda chamada para o banco de dados.
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
}

Observe que estou usando o tipo Schema.Types.ObjectId e não o Número . Dessa forma, você pode atribuir um novo valor a _creator passando o _id ou o objeto pessoa e o mangusto converterá o objeto em seu _id. Por exemplo, você pode postar algo como
{
    _creator : {
        _id     : 123123123123,
        name    : 'Foo',
        birthday: '0000-00-00',
        profilelink: 'http://foo.bar',
        email: '[email protected]'
    },
    title    : 'Mr'
}

... e o mangusto se converterá em
{
    _creator : 123123123123,
    title    : 'Mr'
}

Exemplo 2:

Desta forma, seus dados ainda são normalizados e você pode obter todos os dados das pessoas com uma segunda chamada.
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
}