Твиттер-подобное приложение с использованием MongoDB

Я делаю приложение, в котором используется классический механизм «отслеживания» (тот, который используется Twitter и многими другими приложениями в Интернете). Я использую MongoDB. Однако у моей системы есть отличие: пользователь может подписаться на группы пользователей. Это означает, что если вы подписаны на группу, вы будете автоматически подписываться на всех пользователей, которые являются ее членами. Конечно, пользователи могут принадлежать более чем к одной группе.

Вот что я придумал:

  • когда пользователь A следует за пользователем B , добавляется идентификатор пользователя B во встроенный массив (называемый после ) в документе пользователя A
  • для отмены подписки, я удаляю идентификатор отслеживаемого пользователя из следующих массивов
  • группы работают в том же способ: когда пользователь A следует за группой X , идентификатор группы X добавляется в массив после . (На самом деле я добавляю DBRef , чтобы знать, к пользователю или группе подключено соединение. )

  • когда мне нужно проверить, следует ли пользователь A группе X , я просто ищу идентификатор группы в следующем массиве пользователя A .

  • , когда мне нужно проверить, следует ли пользователь A пользователю B , все становится немного сложнее. Документ каждого пользователя имеет встроенный массив, в котором перечислены все группы, к которым принадлежит пользователь. Поэтому я использую условие $ или , чтобы проверить, следует ли пользователь A либо напрямую, либо через группу. Как это: В документе есть встроенный массив, в котором перечислены все группы, к которым принадлежит пользователь. Поэтому я использую условие $ или , чтобы проверить, следует ли пользователь A либо напрямую, либо через группу. Как это: В документе есть встроенный массив, в котором перечислены все группы, к которым принадлежит пользователь. Поэтому я использую условие $ или , чтобы проверить, следует ли пользователь A либо напрямую, либо через группу. Как это:

    db.users.find ({'$ or': {'following.ref. $ Id': $ user_id, 'following.ref. $ Ref', 'users'}, {'following.ref. $ Id ': {' $ in ': $ group_ids},' following.ref. $ ref ':' groups '}}})

Это работает нормально, но я думаю, что у меня есть несколько проблем. Например, как мне показать список подписчиков для определенного пользователя, включая разбивку на страницы? Я не могу использовать skip () и limit () во встроенном документе.

Я мог бы изменить дизайн и использовать коллекцию userfollow , которая будет выполнять ту же работу, что и встроенная после документ. Проблема с этим подходом, который я пробовал, заключается в том, что с условием $ или , которое я использовал ранее, пользователи, следующие за двумя группами, содержащими одного и того же пользователя, будут перечислены дважды. Чтобы избежать этого, я мог бы использовать группу или MapReduce, что я на самом деле сделал, и это работает, но я бы хотел избежать этого, чтобы все было проще. Может мне просто нужно мыслить нестандартно. Или, может быть, я ошибся в обеих попытках. Кому-нибудь уже приходилось делать подобное и придумать лучшее решение?

(На самом деле это продолжение моего старого вопроса. Я решил опубликовать новый вопрос, чтобы лучше объяснить мою новую ситуацию; надеюсь, это не проблема.)

13
задан Community 23 May 2017 в 10:28
поделиться