我的模型中定义了以下虚拟属性。
var ObjectSchema = new Schema({
short_id: {
type: String,
required: true,
unique: true
},
created: {
type: Date,
default: Date.now
}
})
ObjectSchema.virtual('voted').get(function () {
return false;
})
我尝试在我的控制器中更改它,但它仍然保持不变,为什么会这样?
Object.find({ short_id: req.params.shortId }).exec(function(err, objects) {
objects[0].voted = true;
res.jsonp(objects[0]);
});
JSON仍然说object.voted = false
答案 0 :(得分:1)
如果要自由操作Mongoose查询的结果,可以使用lean()
查询生成纯JavaScript对象而不是模型实例:
Object.find({short_id: req.params.shortId}).lean().exec(function(err, objects) {
objects[0].voted = true;
res.jsonp(objects[0]);
});
答案 1 :(得分:0)
在执行此操作之前,您应该将所有Mongoose对象转换为.toObject()的纯JS对象:
Object.findOne({ short_id: req.params.shortId }).exec(function(err, doc) {
object = doc.toObject();
object.voted = true;
res.jsonp(object);
});
或者,如果您不需要将setter,getter,virtuals或任何其他Mongoose魔法应用于您的文档,您可以使用lean queries(建议JohnnyHK) :
Object.findOne({ short_id: req.params.shortId }).lean().exec(function(err, object) {
object.voted = true;
res.jsonp(object);
});
在这种情况下,您将看到所有文档与MongoDB中存储的文档完全相同。所以,尽管你很有道理,但没有voted
字段。也没有.save()
方法。