Referências de banco de dados
Nesta página
Para muitos casos de uso no MongoDB, o modelo de dados desnormalizado em que os dados relacionados são armazenados em um único documento é ideal. No entanto, em alguns casos, faz sentido armazenar informações relacionadas em documentos separados, normalmente em coleções ou bancos de dados diferentes.
Importante
Você pode usar o estágio do pipeline $lookup
para realizar uma união externa esquerda com uma coleção não fragmentada no mesmo banco de dados.
Você também pode usar o estágio $graphLookup
do pipeline para unir uma coleção não fragmentada e realizar uma procurar recursiva.
Esta página descreve procedimentos alternativos que antecedem os estágios de pipeline de$lookup
e $graphLookup
.
Você pode criar uma referência do banco de dados para implantações hospedadas nos seguintes ambientes:
MongoDB Atlas: o serviço totalmente gerenciado para implantações do MongoDB na nuvem
MongoDB Enterprise: a versão autogerenciada e baseada em assinatura do MongoDB
MongoDB Community: uma versão com código disponível, de uso gratuito e autogerenciada do MongoDB
Os aplicativos do MongoDB usam um dos dois métodos para relacionar documentos:
As referências manuais salvam o campo
_id
de um documento em outro documento como referência. Seu aplicativo executa uma segunda query para retornar os dados relacionados. Essas referências são simples e suficientes para a maioria dos casos de uso.DBRefs são referências de um documento para outro usando o valor do campo
_id
do primeiro documento, o nome da coleção e, opcionalmente, o nome do banco de dados, bem como quaisquer outros campos. Os DBRefs permitem que você faça referência a documentos armazenados com mais facilidade em várias coleções ou bancos de dados.
Para resolver os DBRefs, seu aplicativo deve realizar queries adicionais para devolver os documentos referenciados. Alguns drivers do MongoDB fornecem métodos auxiliares para permitir que os DBRefs sejam resolvidos em documentos, mas isso não acontece automaticamente.
Os DBRefs fornecem um formato e tipo comuns para representar relacionamentos entre documentos. O formato DBRef também fornece semântica comum para representar links entre documentos se o banco de dados precisar interagir com várias estruturas e ferramentas.
A menos que você tenha um motivo convincente para usar DBRefs, use referências manuais.
Referências manuais
Plano de fundo
Uma referência manual é a prática de incluir o campo _id
de um documento em outro documento. O aplicativo pode então emitir uma segunda query para resolver os campos referenciados conforme necessário.
Crie uma referência manual na UI do MongoDB Atlas
Para criar uma referência manual na interface do usuário do MongoDB Atlas, siga estas etapas:
Na interface do usuário do MongoDB Atlas, acesse a página Clusters do seu projeto.
Se ainda não tiver sido exibido, selecione a organização que contém seu projeto no menu Organizations na barra de navegação.
Se ainda não estiver exibido, selecione seu projeto no menu Projects na barra de navegação.
Se ainda não estiver exibido, clique em Clusters na barra lateral.
A página Clusters é exibida.
Navegue até a coleção.
Para o cluster ao qual você deseja adicionar uma referência de banco de dados de dados, clique em Browse Collections.
No painel de navegação esquerdo, selecione o banco de dados.
No painel de navegação esquerdo, selecione a coleção. Este exemplo faz referência a uma coleção
places
.
Adicione um documento na coleção people
que faça referência à entrada em places
.
No painel de navegação esquerdo, selecione uma coleção diferente. Este exemplo faz referência a uma coleção
people
.Clique em Insert Document.
Clique no ícone de visualização JSON ({{}}).
Cole os seguintes dados no documento:
{ "_id": { "$oid": "651aebeb70299b120736f443" }, "name": "Erin", "places_id": "651aea5870299b120736f442" "url": "bc.example.net/Erin" } Clique em Insert.
Quando uma query retorna o documento da coleção
people
que você pode, se necessário, filtrar os resultados da query da coleçãoplaces
para o documento referenciado pelo campoplaces_id
.Para saber mais sobre como executar queries no MongoDB Atlas, consulte Exibir, Filtrar e Classificar Documentos na documentação do MongoDB Atlas.
Criar uma Referência Manual no Terminal
Considere a seguinte operação para inserir dois documentos, usando o campo _id
do primeiro documento como referência no segundo documento:
original_id = ObjectId() db.places.insertOne({ "_id": original_id, "name": "Broadway Center", "url": "bc.example.net" }) db.people.insertOne({ "name": "Erin", "places_id": original_id, "url": "bc.example.net/Erin" })
Em seguida, quando uma query retorna o documento da coleção people
, você pode, se necessário, fazer uma segunda query para o documento referenciado pelo campo places_id
na coleção places
.
Usar
Para quase todos os casos em que você deseja armazenar uma relação entre dois documentos, use referências manuais. As referências são simples de criar e seu aplicativo pode resolver as referências conforme necessário.
A única limitação da vinculação manual é que essas referências não transmitem os nomes do banco de dados e da collection. Se você tiver documentos em uma única collection relacionados a documentos em mais de uma collection, talvez seja necessário considerar o uso de DBRefs.
DBRefs
Plano de fundo
DBRefs são uma convenção para representar um documento, em vez de um tipo de referência específico. Elas incluem o nome da coleção e, em alguns casos, o nome do banco de dados, além do valor do campo _id
.
Opcionalmente, os DBRefs podem incluir qualquer número de outros campos. Os nomes de campo extras devem seguir todas as regras para nomes de campo impostas pela versão do servidor.
Formatar
Os DBRefs têm os seguintes campos:
$ref
O campo
$ref
detém o nome da coleção onde reside o documento referenciado.
$id
O campo
$id
contém o valor do campo_id
no documento referenciado.
$db
Opcional.
Contém o nome do banco de dados onde reside o documento referenciado.
Exemplo
Documentos do DBRef se assemelham ao seguinte documento:
{ "$ref" : <value>, "$id" : <value>, "$db" : <value> }
Considere um documento de uma coleção que armazenou um DBRef em um campo creator
:
{ "_id" : ObjectId("5126bbf64aed4daf9e2ab771"), // .. application fields "creator" : { "$ref" : "creators", "$id" : ObjectId("5126bc054aed4daf9e2ab772"), "$db" : "users", "extraField" : "anything" } }
O DBRef neste exemplo aponta para um documento na coleção creators
do banco de dados users
que tem ObjectId("5126bc054aed4daf9e2ab772")
em seu campo _id
. Ele também contém um campo opcional.
Observação
A ordem dos campos no DBref é importante, e você deve usar a sequência acima ao usar um DBref.
Suporte ao driver para DBRefs
Driver | Suporte DBRef | Notas |
---|---|---|
C | Não suportado | Você pode percorrer as referências manualmente. |
C++ | Não suportado | Você pode percorrer as referências manualmente. |
C# | Suportado | Consulte a página do driver C# para obter mais informações. |
Go | Não suportado | Você pode percorrer as referências manualmente. |
Haskell | Não suportado | Você pode percorrer as referências manualmente. |
Java | Suportado | Consulte a página do driver Java para obter mais informações. |
Node.js | Suportado | Consulte a página do driver .js nó para obter mais informações. |
Perl | Suportado | Consulte a página do driver Perl para obter mais informações. |
PHP | Não suportado | Você pode percorrer as referências manualmente. |
Python | Suportado | Consulte a página do driver do PyMongo para obter mais informações. |
Ruby | Suportado | Consulte a página do driver Ruby para obter mais informações. |
Scala | Não suportado | Você pode percorrer as referências manualmente. |
Usar
Na maioria dos casos, você deve usar o método de referência manual para conectar dois ou mais documentos relacionados. No entanto, se você precisar referenciar documentos de várias coleções, considere usar DBRefs.