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


})

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

帮助表示赞赏。

4

1 回答 1

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

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

于 2013-09-18T15:37:51.357 回答