Мне было интересно, каков наилучший подход, позволяющий пользователям моего приложения следить за другими пользователями и следовать им. В настоящее время у меня есть две отдельные коллекции для хранения данных каждого пользователя: модель пользователя (где в основном я храню только информация, необходимая для аутентификации) и модель профиля пользователя. В каждом документе модели профиля есть два массива: первый содержит все идентификаторы людей, следующих за этим пользователем, а второй - список людей, за которыми он следует.
ProfileSchema = new Schema({
owner: { type: Schema.Types.ObjectId, ref: "User" },
followers: { type: [Schema.Types.ObjectId], default: [] },
following: { type: [Schema.Types.ObjectId], default: [] },
created_at: {
type: Date,
default: Date.now
}
});
Сначала я подумал, что это правильный подход, я должен сохранить всех подписчиков в отдельных коллекциях.
Но моя настоящая проблема заключается в том, что я не знаю, как настроить функцию, которая обрабатывает последующие и последующие функции.
Например, я мог бы настроить функцию, которая просто выполняет два прохода:
- в первую очередь идет добавить пользователя в список подписчиков пользователя, который хочет подписаться
- последовательно добавляет пользователя в список людей, которые следуют за пользователем, сделавшим запрос.
Проблема в том, что если функция выполняет первый проход, но затем не завершает второй из-за ошибки или сбоя базы данных, у меня будет пользователь с огромной проблемой, почти неразрешимой, если вы не перейдете к редактировать непосредственно документ, который в приложении тысяч пользователей невозможно. Таким образом, пользователь, затронутый этой ошибкой, может оказаться за человеком «А», но «А» не увидит, что он следует за ним