Я не совсем понимаю, как предложенная вами схема эффективно предоставит вам необходимую информацию.
Я бы предложил следующее:
db.groups {
_id: <group code>,
creator: <UUID of creator>,
}
db.members {
_id: <UUID of group member>,
groupCode: <group code>
referrals: [
<UUID of referred user>
]
referralCount: <size of referrals array for speed/convenience>
}
CREATE GROUP :
db.groups.save({_id: <group code>, creator:<UUID of creator>})
db.members.save({_id:<UUID of creator>, groupCode: <group code>})
REFER USER :
db.members.update({_id: <UUID of referrer>}, {$push:{referrals: <UUID of referred user}, $inc:{referralCount:1}})
FOR A GIVEN CODE, HOW MANY PEOPLE DID YOU REFER :
db.members.find({_id: <UUID of user>, groupCode: <group code>}) -> first result .referralCount
WHICH CODES IS A USER PART OF :
db.members.find({_id: <UUID of user>}) -> results .groupCode
OR
db.members.distinct("groupCode", {_id: <UUID of user>}) for a direct array of codes
Причина, по которой я разделил его, заключается в том, что сохранение списка членов внутри документа групп в виде встроенного массива усложнит определенные обновления, может привести к ограничению документа в 16 Мб и резко увеличит требования к пропускной способности для ваших запросов (обратите внимание, что вы в таких случаях необходимо найти весь групповой документ для каждого запроса участника).
Надеюсь, это поможет.