Вложенные комментарии в MongoDB - PullRequest
4 голосов
/ 10 марта 2011

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

  • Пометить комментарии как спам / одобренои получить комментарии по этим атрибутам
  • Получить комментарии пользователя
  • Получить количество комментариев для объекта / пользователя

Кроме того, конечно, отображение комментариев, как это обычно делается,Если у вас есть какие-либо предложения о том, как справиться с этими вещами с MongoDB - или - скажите мне, чтобы найти альтернативу, это будет высоко оценено!

Ответы [ 2 ]

2 голосов
/ 10 марта 2011

Поскольку вам необходимо получить комментарии по некоторым атрибутам, по пользователю и т. Д., Вы не можете встраивать (встраивание всегда быстрее для баз данных документов) комментарии в каждый объект, который пользователи могут комментировать.Поэтому вам нужно создать отдельную коллекцию для комментариев.Я предлагаю следующую структуру:

comment
{
  _id : ObjectId,
  status: int (spam =1, approved =2),
  userId: ObjectId,
  commentedObjectId: ObjectId,
  commentedObjectType: int(for example question =1, answer =2, user =3),
  commentText
}

С вышеупомянутой структурой вы можете легко делать то, что вам нужно:

//Mark comments as spam/approved and retrieve comments by this attributes
//mark specific comment as spam
db.comments.update( { _id: someCommentId }, { status: 1 }, true); 
db.comments.find({status : 1});// get all comments marked as spam

//Retrieve comments by user
db.comments.find({'_userId' : someUserId});

//Retrieve comment count for an object/user
db.comments.find({'commentedObjectId' : someId,'commentedObjectType' : 1 })
           .count();

Также я полагаю, что для подсчета комментариев будет лучше создать дополнительное поле в каждомобъект и inc это в комментарии добавить / удалить.

1 голос
/ 11 марта 2011

Рассматривали ли вы хранение комментариев во всех документах, для которых нужна ссылка на них? Если у вас есть документ для пользователя, сохраните все комментарии этого пользователя. Если у вас есть отдельный документ для объектов, сохраните там все комментарии Это кажется неправильным после того, как вы пришли из реляционного мира, где вы пытаетесь получить ровно одну копию заданного фрагмента данных, а затем ссылаетесь на него по идентификатору, но даже в реляционных базах данных вы должны начать дублировать данные, если вы хотите, чтобы выполнялись запросы быстро.

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

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