2013-07-30 3 views
0

У меня есть сбор сообщений, в котором хранятся сообщения, связанные с информацией и информацией об авторе. Это вложенное дерево. Тогда у меня есть сортировочная коллекция, в которой хранится, какой пользователь оценил конкретное сообщение вверх или вниз.mongodb - добавить столбец в одну коллекцию найти на основе значения в другой коллекции

Когда запрос сделан, чтобы получить вложенное дерево для определенного сообщения, мне также нужно вернуть, если текущий пользователь проголосовал, и если да, то вверх или вниз по каждому возвращаемому сообщению.

В SQL это будет что-то вроде «posts. *, Postrating.vote from posts join postrating on postID и postrating.memberID = currentUser».

Я знаю, что MongoDB не поддерживает соединения. Каковы мои варианты с MongoDB?

  1. использовать карту уменьшить - производительность для простого запроса?
  2. в почтовом магазине хранятся оценки - предел размера BSON?
  3. Получить список всех необходимых сообщений. Получить список всех голосов от текущего пользователя. Петля на сообщениях, и если пользователь проголосовал, добавьте это для вывода?

Есть ли другой способ? Можно ли это сделать, используя агрегацию?

ПРИМЕЧАНИЕ. На прошлой неделе я начал работу с MongoDB.

ответ

0

В MongoDB самый простой способ, вероятно, справиться с этим с помощью прикладной логики, а не попробовать это в одном запросе. Есть много способов структурирования данных, но вот одна возможность:

user_document = { 
    name : "User1", 
    postsIhaveLiked : [ "post1", "post2" ... ] 
    } 

post_document = { 
    postID : "post1", 
    content : "my awesome blog post" 
    } 

С этой структурой, вы бы первый запрос для user_document пользователя. Затем, для каждого отправленного сообщения, вы можете проверить, находится ли postID сообщения в списке «postsIhaveLiked» этого пользователя.

Основная идея заключается в том, что вы получаете свои данные в два этапа, а не один. Это отличается от объединения, но основано на одной и той же основной идее использования одного ключа (в данном случае postID) для связи двух разных частей данных.

Как правило, старайтесь избегать использования уменьшения карты по соображениям производительности. И для этого простого варианта использования агрегация - это не то, что вы хотите.

+0

Я закончил тем, что реализовал его аналогичным образом. – MavWolverine

Смежные вопросы