我试图按照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
[]
如果这是预期的行为,我不会这样做,但我只想删除匹配的评分而不是所有的子文档。
答案 0 :(得分:0)
找到一个工作的sol'n。 问题是最初定义评级架构的方式和how save() works:
var Ratings = new Schema({
_id: false,
rating: Boolean,
user: {
type: Schema.ObjectId,
ref: 'User'
}
});
我认为用户引用将足够独特,可以使用wrt修改评级 我仍然不知道为什么pull()会删除所有的子目录,无论用户ID如何 当它节省时间时,由于缺少_id,它更新了整个收视率阵列的覆盖 要修复此问题而不是使用用户更新,我将其切换为使用_id。 另外,在再次打开和关闭_id标志时要小心。驱动程序将抛出未定义的objectid errs。