我正试图按照upvotes / downvotes的方式实施评级系统 . 用户只能对课程进行一次投票 . 他们可以在上下之间切换投票 . 投票与之前的投票相同,即可取消投票 . 我试图用pull()完成这个,但它清空了整个评级数组,包括其他用户的投票 .
评级架构
var RatingSchema = new Schema({
rating: Boolean,
user: {
type: Schema.ObjectId,
ref: 'User'
}
});
课程架构
var LessonSchema = new Schema({
...,
ratings: [RatingSchema]
});
问题代码
//assuming lesson.ratings looks like this
[{user: 123..., rating: true},
{user: 321..., rating: true}];
//assuming lesson was loaded from a query
lesson.ratings.pull({user: 123...});
//resulting ratings
[]
我不是,如果这是预期的行为,但我只想删除匹配的评级,而不是所有的子文档 .
1 回答
找到了一个工作的sol'n . 问题是最初定义评级模式的方式和how save() works:
OG评级架构
我认为用户引用将足够独特,可以使用wrt修改评级 .
我仍然不知道为什么pull()会删除所有的subdocs而不管用户id .
当它节省时间时,由于缺少_id,它完全更新了整个收视率阵列覆盖 .
要修复此问题而不是使用用户更新,我将其切换为使用_id . 另外,在再次打开和关闭_id标志时要小心 . 驱动程序将抛出未定义的objectid errs .