更新Mongoose Subdocument集合

时间:2013-08-22 05:51:16

标签: mongodb mongoose

我有以下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({


})

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

帮助表示赞赏。

1 个答案:

答案 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无论如何都在用他们的人口方法做的事情。就个人而言,我可以使用额外的查找步骤来换取对数据的更多控制。