Надо сказать, что вам удалось меня поразить.
Можно довольно много говорить о том, для каких связных данных и для каких запросов лучше использовать реляционные и графовые базы. При какой глубине переходов по связям реляционной будет достаточно (и даже лучше именно их), а при каких уже лучше графовую.
Но вы сделали невозможное. Вы смоделировали классическую задачу "друзья друзей" в максимально неподходящей для этого модели данных - документной. И теперь вы хотите
Неких JOIN такой.
Итак, еще раз, знакомьтесь:
графовая БД. Из конкретных представителей рекомендую посмотреть
Neo4j и
OrientDB.
Важно, что обе СУБД имеют средства для хранения "отношений со свойствами", т.е. ваших
у друзей свои уникальные свойства по отношению к этому пользователю
Вот пример из
доков по Neo4j:
Relationships between nodes are a key part of a graph database. They allow for finding related data. Just like nodes, relationships can have properties.
Картинка.
Аналогичная концепция в OrientDB:
In addition to mandatory properties, each vertex or edge can also hold a set of custom properties. These properties can be defined by users, which can make vertices and edges appear similar to documents.
Да, кстати о документах. OrientDB позиционируется как документно-графовая, так что вполне возможно вам с ней будет проще. Вот их самосравнение с Монгой:
orientdb.com/orientdb-vs-mongodb
P.S. Да, маркетинг - великая сила. Это я про MongoDB.
Или вообще для реализации данного желательно делать это все не на mongo?
Хорошо, что вы осмеливаетесь задавать себе такой вопрос. Это правильно.