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

Como você modelaria um relacionamento de amizade no MongoDB?


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 não pode fazer JOINs só pode executar JOINs em coleções não fragmentadas , portanto, você deve evitar espalhar os dados necessários para um caso de uso específico em várias coleções, mesmo quando isso significa que você cria redundâncias. Caso contrário, você precisaria realizar várias consultas uma após a outra, o que diminui significativamente o tempo de resposta do seu aplicativo.

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();