Conforme sugerido neste post, proponho aqui minha pergunta.
Tenho um MongoDB collections spots que tem documentos que representam a amizade entre dois usuários
{
"_id": "64a337de4538a04610900f0c",
"user1": "6468022102781d442b82afd7",
"user2": "648c7b6b75231cd99e43d7ab",
"areFriends": true
}
Meu objetivo é escrever uma agregação que, dados dois IDs de usuários, retorne o grau de separação deles. Para ser claro, algo assim:
- 1 = amigos diretos
- 2 = amigos de amigos
- 3+ etc..
Me deparei com o exemplo acima de $graphLookup e agora estou pensando em como implementar algo semelhante.
A diferença entre meu caso e o outro post é que meus documentos não têm uma relação unidirecional (de-para), mas bidirecional (usuário1, usuário2); portanto, não há garantia de que o usuário desejado seja armazenado como usuário1 ou usuário2.
Em outras seções do meu código, resolvo esse problema ordenando os IDs de entrada ou usando condições como esta:
$cond: {
if: { $eq: ['$user1', userId] },
then: '$user2',
else: '$user1',
},
No entanto, entendi que as condições não são suportadas conforme arquivadas (como connectFromField ) em $graphLookup
Alguém tem alguma pista sobre como enfrentar esse problema em particular? Ficaria muito agradecido. Obrigado.
EDIT esta é uma versão revisada do pipeline de agregação proposto por Ray
{ $match: { user1: id1 } },
{
$graphLookup: {
from: 'spots',
startWith: '$user1',
connectFromField: 'user2',
connectToField: 'user1',
as: 'friendshipsViewLookup',
depthField: 'degree',
maxDepth: 2,
},
},
{
$unwind: {
path: '$friendshipsViewLookup',
preserveNullAndEmptyArrays: true,
},
},
{ $match: { 'friendshipsViewLookup.user2': id2 } },
{
$project: {
user1: 1,
user2: '$friendshipsViewLookup.user2',
degree: {
$add: ['$friendshipsViewLookup.degree', 1],
},
},
},
{
$group: {
_id: { user1: '$user1', user2: '$user2' },
minDegree: { $min: '$degree' },
},
},
{
$project: {
user1: '$_id.user1',
user2: '$_id.user2',
degree: '$minDegree',
},
}