O MongoDB geralmente não é uma boa opção para modelar relações de grafos. Existem bancos de dados gráficos especializados que se destacam nessa tarefa.
No entanto, quando você não deseja adicionar outra tecnologia de banco de dados ao mix, recomendo criar uma nova coleção
frienships
e modele cada relação de amigo como um documento com uma matriz de duas entradas, cada uma delas um objeto com as informações abreviadas sobre um dos usuários que você precisa para exibir uma entrada em suas listas de amigos:{
friendship: [
{
id:123,
name: "Bob",
avatar: "Bob.jpg"
},
{
id:456,
name: "Alice",
avatar: "Alice.jpg"
}
]
}
A razão para duplicar as informações dos documentos do usuário nos documentos de amizade é evitar uma segunda consulta à coleção de usuários para obter todos os dados para exibir uma lista de amigos do usuário. MongoDB
Quando você quiser obter a lista de amigos do usuário 123, execute um
db.friendships.find({"friendship.id", 123})
(um índice em friendship.id
melhorará o desempenho) e, em seguida, receberá uma lista de documentos em que Bob é o primeiro ou o segundo amigo. Você então iteraria esses documentos e produziria as informações curtas da entrada do array que não usuário 123.
Como alternativa, você pode filtrar as entradas Bob no banco de dados com um pipeline de agregação. Use a consulta $match acima, $desfaça o array de amizade e então $match aqueles documentos em que o id não é 123. Isso seria uma compensação:você conserva largura de banda às custas da carga da CPU no servidor de banco de dados.
Para consultar se já existe uma relação de amizade, use:
db.friendships.find( { $and: [
{ "friendship.id": 123 },
{ "friendship.id": 456 }
] } ).count();