2013-08-22 3 views
1

У меня есть следующий мангуст схема, определенный ...Обновления Mongoose поддокумент коллекция

var BlogSchema = new Schema({ 
    content: String, 
    comments:[CommentSchema], //embed the comments 
    owner: {type: ObjectId , ref: 'User'} 
}) 


var CommentSchema = new Schema({ 
    commentContent : String, 
    commentPostTime : Number, 
    likes : [{type: ObjectId , ref: 'User'}], 
    likeCount: {type: Number, default:0} 
}) 

var UserSchema = new Schema({ 


}) 

Когда пользователь любит комментарий. Пользователь должен быть добавлен в список избранных, а встроенный комментарий Subdocument в Blog Document должен быть обновлен. Я не уверен, как это достичь.

Помогите оценить.

ответ

2

Поскольку ваша UserSchema не содержит много информации, это, вероятно, проще всего, если вы не пытаетесь подделать соединение через функцию популяции Mongoose. Используя MongoDB самостоятельно, выполнение этого было бы выполнено с помощью одной операции. Ниже я просто сохраняю поле «_id» некоторого пользовательского документа, который я хочу ссылаться.

> var userID = userdoc._id; 
> db.comments.update({ _id : commentID }, 
       { $push : { likes : userID } }); 

Делать это с Мангустой может потребовать от вас немного изменить схему:

var CommentSchema = new Schema({ 
    commentContent : String, 
    commentPostTime : Number, 
    likes : [ObjectId], 
    likeCount: {type: Number, default:0} 
}) 

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

Comment.findByIdAndUpdate(commentID, { $push : { likes : "samantha" }, $inc : { likeCount : 1 } }); 

Это лучше, чем использование населения Мангуста? Обработка ваших данных таким образом сделает дополнительный шаг, когда вы будете искать пользователей из комментариев. Во-первых, вам придется захватить идентификатор пользователя из списка понравившихся в комментарии, тогда вам придется запустить отдельный запрос, чтобы получить документ этого пользователя. Однако, поскольку ваш прецедент не требует какого-либо поиска в пользовательских документах, этот подход должен хорошо работать для вас. Я считаю, что этот двухэтапный процесс - это то, что Мангуст делает под капотом в любом случае с помощью своего метода популяции. Лично я в порядке с дополнительным шагом поиска в обмен на больший контроль над моими данными.