мой поток:
Пользователь A выбирает пользователя B в списке пользователей:
системе необходимо проверить, существует ли комната для этих двух пользователей, если не создать уникальное имя комнаты, а затем присоединить обоих пользователей к комнате
если существует, то просто присоедините пользователей к комнате, в которой они уже были, и заполните чат предыдущими сообщениями
Теперь я застрял в том, как именно это сделать. Несколько вариантов, с которыми я обдумываю:
а) Во-первых, как мне создать уникальное имя, связывающее обоих пользователей? Конечно, я могу использовать комбинацию строк для обоих пользователей, например, пользователь A нажимает на пользователя B -> «A&B», но это не сработает, когда пользователь B нажимает на пользователя A, потому что это будет «B&A». Я изо всех сил пытаюсь создать динамические уникальные имена, которые можно было бы применить к обоим.
б) я сохраняю массив с информацией о двух пользователях в конкретной комнате, сохраненной в БД, а затем проверяю массив, если пользователь уже существует в нем? если да, просто использовать этот идентификатор комнаты в качестве имени комнаты? Как лучше всего сохранять созданные комнаты? Могу ли я сохранять по имени комнаты, которое, я думаю, также будет действовать как уникальный идентификатор?
c) должен ли я проверять БД КАЖДЫЙ пользователь нажимает другого пользователя, чтобы начать чат, просто чтобы проверить, существует ли комната или нет?
Я знаю, как создавать комнаты и весь этот джаз, но на самом деле я борюсь с тем, как динамически создавать имена комнат, чтобы было одинаково, нажимает ли A B или B нажимает A, и как с уровня псевдокода хранить созданные комнаты в БД и проверьте у многих пользователей.

Вот идея: сохраните комнату в своей базе данных как документ, содержащий поля user1 и user2, которые будут содержать идентификаторы этих пользователей. В частности, убедитесь, что user1 < user2. Когда вам понадобится запросить этот документ позже, вы можете использовать db.rooms.findOne({user1: smallerId, user2: largerId}). Затем вы можете либо сохранить имя комнаты и не использовать его в своих запросах, либо вы даже можете динамически сгенерировать отображаемое имя комнаты во время выполнения.
Это дает то преимущество, что не только гарантирует структуру документа комнаты, но и делает ваши запросы более эффективными (вы сравниваете двоичный код и сравниваете строки). Также есть преимущество в том, что запрос не прерывается при изменении имени пользователя.
Обычно рекомендуется, чтобы документ A, связанный с другим документом B, ссылался на документ B по неизменяемому идентификатору, а не по изменяемому имени. В этом случае, так как room связан с двумя users, room относится к каждому идентификатору user.
Верный. Если вы внимательно следите за тем, чтобы два идентификатора пользователя всегда были в одном порядке, тогда вам понадобится только один запрос, чтобы определить, существует ли комната. В противном случае вам нужно будет попробовать оба заказа. Кроме того, может быть хорошей идеей выполнить upsert, если комнаты не существует, таким образом, если оба пользователя создают комнату одновременно, один будет вставкой, а другой будет обновлением вновь созданной комнаты.
Спасибо @B. Флеминг. Если я правильно понимаю, вы говорите, что документ будет иметь два идентификатора пользователя. Итак, когда я, например, снимаю комнату, я ищу документ, в котором есть два идентификатора пользователя? если да, я использую название комнаты, связанное с этим?