为什么我不能在控制器中修改模型的虚拟属性?

时间:2014-02-03 05:09:35

标签: javascript node.js mongoose

我的模型中定义了以下虚拟属性。

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

2 个答案:

答案 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()方法。