[MÚSICA]
Acho que agora, sua cabeça está infestada de mangustos ou é mongansos?
Bem, eu não sou estudante de inglês, então eu não tenho idéia do que é o plural.
Em qualquer caso, isso nos leva ao tema desta palestra, População de Mangusto.
O que exatamente é a população de Mangusto e
como é útil em nossa aplicação expressa?
Vamos falar sobre isso a seguir.
Como percebemos, os bancos de dados de documentos, os bancos de dados NoSQL,
não são projetados com relações em mente.
Tudo o que você precisa em um documento é armazenado completamente dentro do documento.
Bem, essa é praticamente a maneira como as coisas funcionam com bancos de dados NoSQL como MongoDB.
Então você não tem suporte para relações que você pode estar
mais familiarizado com o mundo do banco de dados relacional.
Onde você tem registros e, em seguida, registros podem fazer referência a outros registros e assim por diante.
E então você faz junções, a fim de juntar as informações dos registros e assim por diante.
Portanto, esse tipo de suporte não existe em bancos de dados NoSQL,
pelo menos em grande medida.
MongoDB tomou alguns passos nessa direção, mesmo com os bancos de dados NoSQL.
Mas, em geral, bancos de dados de documentos esperam que todos os documentos sejam autônomos.
Então, o que significa que todas as informações necessárias estão dentro do mesmo documento.
Agora, é claro, há situações em que você tem outros documentos que
já continha as informações.
E talvez você queira extrair essas informações para o documento existente, em
vez de duplicar essas informações.
Então este é o lugar onde MongoDB ou Mangusto,
permite que você armazene referências a outros documentos dentro de um documento atual.
A referência ao outro documento é feita usando o ObjectID desse
outro documento.
Agora, se esse for o caso, então Mangusto permite que você execute uma maneira de
pegar as informações do outro documento e, em seguida, anexá-lo
dentro do documento correto usando o apoio da população Mangusto.
É isso que discutiremos com um pouco mais de pormenor.
O próprio Mangusto, como percebemos, sendo um módulo construído
sobre o MongoDB, não tem suporte explícito para
junções, a maneira como falamos sobre junções no mundo SQL.
Para entender como essa referência do outro documento em um documento nos ajuda e
como ele está realmente estruturado, vamos dar uma olhada em um exemplo.
Neste exemplo, vamos olhar para o documento de pratos que
temos usado em nosso exercício.
Nos documentos de pratos que armazenamos no lado do servidor,
notamos que também armazenamos os comentários.
E dentro dos comentários, também armazenamos um campo de autor dentro dos comentários.
E o campo autor contém explicitamente o nome da pessoa que
enviou esse comentário específico.
Agora, uma vez que já temos um documento
de usuários dentro do nosso banco de dados, como vimos neste módulo.
Nós tínhamos estendido nosso servidor especializado para suportar usuários e, assim,
você pode registrar um usuário e que você pode autenticar usuários e assim por diante.
Assim, o documento do usuário pode transportar informações adicionais sobre o usuário já.
Então, quando um comentário é postado pelo usuário,
em vez de armazenar o nome do usuário dentro do próprio comentário,
por que não ter uma referência ao usuário específico que postou o comentário?
Isso é útil não só em termos de ser capaz de
lidar com o fato de que este comentário é publicado pelo usuário específico.
Mais tarde, veremos que, se você precisar permitir que os usuários modifiquem ou
excluam documentos, você pode querer restringir o tipo
de operação de um usuário específico apenas aos comentários
que esse usuário específico publicou anteriormente.
Mesmo que estejamos usando sub-documentos dentro do nosso documento Mongo.
Se pudermos fazer referência a outro documento no subdocumento usando ObjectIDs,
então Mongo nos ajuda a fazer população dessas
informações do outro documento para o documento atual.
Então é aqui que a população de Mangusto vem em nosso resgate.
Levando esta ideia mais longe, deixe-me mostrar-lhe um
exemplo detalhado do esquema de comentários que definimos anteriormente.
Então, no CommentSchema, já temos o campo de classificação e
o campo de comentário que já especificamos lá.
Também costumávamos ter o campo de autor anteriormente.
Para o campo autor anteriormente, estávamos armazenando o autor como
uma string e, O valor padrão também para o autor.
Agora, ao armazenar o autor como uma string de tipo, se agora transformar
o autor em um tipo de mongoose.schema.types.ObjectId.
Então, o que significa que o campo autor agora irá conter um ObjectID,
que é uma referência a um documento de usuário.
Como você garante que isso está fazendo referência a um documento de usuário?
Então é aqui que esta propriedade adicional chamada ref, que especifica que
o esquema do documento que você está se referindo aqui é do tipo, o usuário,
esquema e o modelo que já adicionamos anteriormente.
Então, neste caso, o esquema de comentário agora é estendido para armazenar as informações do autor,
mas as informações do autor estão em uma forma de ObjectId.
Que é uma referência ao documento do usuário que já está armazenado em nosso banco de dados.
Agora, como é que isto nos ajuda?
É aqui que, como eu disse, a população de Mangusto vem em nossa ajuda.
Então, como funciona a população de Mangusto?
Com a população de Mangusto, a forma como a população de Mangusto funciona
é que ele substitui automaticamente caminhos especificados dentro de um documento atual.
Que tem referência a outro documento pelas informações desse outro documento.
Portanto, no esquema de comentário, por exemplo, você tem um campo de autor que
está se referindo ao ObjectId do documento de usuário que já está em seu banco de dados.
Assim, com a população de Mangusto, quando você pedir Mangusto para preencher este documento prato, em
seguida, ele irá preencher as informações sobre o autor no campo
de comentários do documento do usuário.
Assim, as informações sobre o autor específico que é referenciado lá serão
obtidas e adicionadas ao seu documento prato.
E o documento composto será construído e enviado de volta para você.
Como garantimos que isso aconteça?
É aqui que a referência cruzada com o ObjectID, como vimos, nos ajuda.
Como é que a população realmente acontece em código?
Dando uma olhada em como poderíamos preencher, por
exemplo, o documento de pratos que acabamos de ver anteriormente.
Mais cedo estávamos fazendo pratos.Encontre para encontrar todos os pratos em nosso banco de dados.
Agora, uma vez que você encontrar o documento Pratos, então você pode dizer preencher.
E, em seguida, forneça dentro do preenchimento, como parâmetro,
o campo específico que precisa ser preenchido.
Então, aqui estamos especificando comentários.author.
Agora a expectativa é que o campo comments.author é
realmente um OjectId que faz referência ao documento do usuário.
E é assim que já configuramos nosso esquema de comentários.
Então esta chamada de preenchimento que realizamos aqui irá então
buscar do banco de dados cada registro do autor individual ou o registro do usuário.
E, em seguida, pegue esse documento de usuário e
preencha-o no documento de pratos para construir o documento composto a partir daqui.
E depois disso,
é claro, há alguns manipulação subsequente de dados que você obteve.
E, em seguida, responder ou retornar os dados para o cliente pode ocorrer neste momento.
Mas é claro, deixe-me avisá-lo que esta operação de população
não é uma tarefa fácil para o servidor fazer.
Porque cada prato, você terá que examinar cada comentário.
Então, para cada comentário, então você precisa descobrir seu ObjectID para
o usuário.
Em seguida, você vai buscar o documento do usuário e
, em seguida, preenchê-lo dentro do documento prato.
E, em seguida, isso tem que ser repetido para
cada comentário que está contido no documento Dishes.
Isso significa essencialmente que vai demorar muito mais tempo para o lado do servidor
para concluir a solicitação e enviar de volta as informações para o lado do cliente.
Então eu sugiro que você deve usar povoar muito judiciosamente.
Você deve usá-lo apenas em circunstâncias em que você realmente precisa dessa informação.
Se, por exemplo, você está simplesmente construindo o menu para o seu restaurante.
Quando você está apenas construindo o menu para o seu restaurante,
você pode realmente não precisar preencher as informações sobre o autor de cada
comentário no documento de comentário em tudo.
Porque quando você está apenas renderizando o menu para o seu restaurante,
você não vai estar mostrando os comentários para esse prato específico.
Mas, em vez disso, se o usuário estiver examinando um prato específico e
quiser ver os comentários nesse ponto,
você pode querer executar uma solicitação do lado do servidor.
E, em seguida, buscar as informações do comentário com as outras informações do autor
preenchidas e obtê-lo para uso dentro do lado do nosso cliente.
Então, novamente, popular é uma maneira maravilhosa de fazer as coisas quando necessário,
mas usá-lo muito judicialmente, somente quando você realmente precisa das informações.
Então essa flexibilidade que povoam
nos fornece é o fato de que não precisamos preencher quando não precisamos.
Mas podemos preencher a informação quando realmente precisamos dessa informação.
Com esta rápida compreensão da população de Mangusto,
vamos passar para o exercício onde vamos modificar o esquema de pratos,
o esquema de comentários dentro do esquema de pratos.
E, em seguida, usar Mongoose populate para preencher a informação dentro de nossos pratos
quando estamos devolvendo a informação do prato para o lado do servidor.
Além disso, isso também implica que quando um comentário está sendo adicionado a um prato específico,
o autor da informação do comentário deve ser capturado no lado do servidor.
Agora, acontece que a forma como desenvolvemos nossos servidores,
já temos essa informação sendo fornecida para nós.
Quando autenticamos o usuário, as informações do usuário já são carregadas em cada
solicitação que vem do lado do cliente.
E assim eles usam que as informações do usuário estão disponíveis para nós.
Então, quando estamos postando o comentário no lado do servidor, vamos também
capturar o ID do usuário e, em seguida, armazená-lo no campo autor do esquema de comentário.
Isso deve ser feito automaticamente no lado do servidor.
O cliente não deve ter permissão para preencher o campo de autor explicitamente.
Mas o lado do servidor deve validar o usuário e somente para
usuários que estão conectados, você permitiria que eles, em primeiro lugar, postem comentários.
E então, quando eles publicarem comentários,
você preencherá automaticamente o campo de autor desse documento de comentário
substituindo o campo de autor pelo ObjectID do usuário.
Agora, no exercício, você vai me ver fazendo isso.
Então cuidado com aquela coisa específica no exercício.
Com isso, completamos esta palestra,
vamos prosseguir para o exercício para examinar o uso da população de Mangusto.
[ MUSIC]