Добавление group_id для меня кажется сомнительной затеей, по пару причинам:
1. friends содержит больше информации чем просто друзья
2. разные места хранения group_id, что тоже не збсь
3. Возможная дупликация данных, и необходимость это все менеджить.
По этому упрости лучше себе жизнь, и в friends тупо храни список друзей.
Если проще делать, то просто храни массив ID чтобы было проще индексировать.
Если таки хочешь объект держать, то не используй массив, а используй реальный объект:
friends: {
friend_id: {
added: Date,
state: 1
}
};
friend_id - реальный ID друга.
Но все равно тебе прийдется иметь отдельно массив со списком всех ID в нем для индексации, т.к. индексировать key'и объекта нельзя.
В итоге дополнительное поле будет:
friend_ids: [ friend_id_1, friend_id_2 ];
Когда у тебя будет такой формат данных, тебе будет в разы проще обновлять какие-то данные конкретного друга, либо удалить его сразу.
Ты изначально себе усложнил задачу используя массив.
Также не храни там group_id, храни их в одной коллекции отдельно, чтобы было в разы проще оперировать этим делом.
Обновить стейт друга 64 у пользователя 32:
db.users.update({
_id: 32
}, {
$set: {
'friends.64.state': 0
}
});
Удалить друга:
db.users.update({
_id: 32
}, {
$unset: {
'friends.64': 1
},
$pull: {
'friend_ids': 64
}
});