我有以下mongoose Schema的定义......
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({
})
当用户喜欢评论时。应将用户添加到喜欢列表中,并且应更新博客文档中的嵌入式评论子文档。我不知道如何实现这一目标。
帮助表示赞赏。
答案 0 :(得分:2)
由于您的UserSchema不包含太多信息,如果您不尝试通过Mongoose的填充功能伪造连接,则可能最简单。单独使用MongoDB,只需一次操作即可完成。下面,我只是存储我想要引用的一些用户文档的“_id”字段。
> var userID = userdoc._id;
> db.comments.update( { _id : commentID },
{ $push : { likes : userID } } );
使用Mongoose执行此操作需要您稍微更改架构:
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 } } );
这比使用Mongoose人口好吗?当您从评论中查找用户时,以这种方式处理数据将需要额外的步骤。首先,您必须从注释中的喜欢列表中获取userID,然后您必须运行单独的查询来获取该用户的文档。但是,由于您的用例似乎不需要在用户文档中查找任何内容,因此这种方法应该适合您。在性能方面,我相信这个两步过程就是Mongoose无论如何都在用他们的人口方法做的事情。就个人而言,我可以使用额外的查找步骤来换取对数据的更多控制。