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