2013-08-22 171 views
1

我有以下的猫鼬架构的定义...更新猫鼬子文档集合

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({ 


}) 

当用户喜欢评论。应将用户添加到喜好列表中,并且应更新Blog文档中嵌入的评论子文档。我不知道如何实现这一点。

帮助表示赞赏。

回答

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 } }); 

这是否比使用猫鼬种群更好?以这种方式处理您的数据将在您从评论中查找用户时采取额外步骤。首先,您必须从评论中的喜欢列表中获取userID,然后您必须运行单独的查询来获取该用户的文档。但是,由于您的使用案例似乎并不需要在用户文档中查找任何内容,因此这种方法应该适合您。在性能方面,我相信这个两步骤的过程就是Mongoose在他们的人口方法下所做的。就个人而言,我很满意额外的查找步骤,以换取更多的数据控制权。