Para a maioria dos casos de uso do MongoDB, o modelo de dados desnormalizado armazena dados relacionados em um único documento. Em alguns casos, é necessário 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.
Os aplicativos do MongoDB usam um dos dois métodos para relacionar documentos:
As referências manuais salvam o campo
_idde 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
_iddo primeiro documento, o nome da coleção e, opcionalmente, seu nome de banco de dados , bem como quaisquer outros campos. Os DBRefs permitem referenciar documentos armazenados 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 assistente que resolvem DBRefs em documentos, mas a resolução não é automática.
Os DBRefs fornecem um formato e tipo comuns para representar relacionamentos entre documentos. O formato também fornece semântica comum para representar links entre documentos quando seu banco de dados interage 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 inclui o campo _id de um documento em outro documento. O aplicativo pode então executar 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, vá para 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.
Na barra lateral, clique em Clusters sob o título Database.
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
peopleque você pode, se necessário, filtrar os resultados da query da coleçãoplacespara 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 relacionamento entre dois documentos, use referências manuais. Eles são simples de criar e seu aplicativo pode resolvê-los conforme necessário.
As referências manuais não transmitem os nomes do banco de dados e da coleção. Se os documentos em uma única coleção estiverem relacionados a documentos em mais de uma coleção, considere usar 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 as regras para nomes de campo impostas pela versão do servidor.
Formatar
Os DBRefs têm os seguintes campos:
$refO campo
$refdetém o nome da coleção onde reside o documento referenciado.
$idO campo
$idcontém o valor do campo_idno documento referenciado.
$dbOpcional.
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 Node.js 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, use referências manuais para conectar dois ou mais documentos relacionados. Se você precisar referenciar documentos de várias coleções, considere usar DBRefs.