猫鼬 - 模型实例发生了什么?

时间:2016-03-30 21:22:49

标签: mongodb mongoose

在mongoose中实例化模型时,我注意到了这个有趣的事情 - 实例可以通过除实例本身之外的其他方式进行更改。这是一个例子:

var articleSchema = new Schema({
    name: 'String',
    price: 'Number'
});

var Article = mongoose.model('Article', articleSchema);

var nexus = new Article({
    name: 'Nexus 5',
    price: 300
});

nexus.save(function(err, instance) {
    instance.name = 'Nexus Five';
    instance.save(function(err, instance2) {
        instance2.name = 'Nexus 5ive';
        instance2.save(function(err, instance3) {
            console.log(nexus.name); //'Nexus 5ive'
        });
    });
});

正如您在示例中看到的,我从未更改name的{​​{1}}属性,我更改了nexus函数在回调中返回的模型的属性。以这种方式改变数据是否可以?或者我应该坚持第一个定义的实例(即save变量)?这似乎有点令人困惑,因为你很容易失去对你正在处理的事情的控制。

1 个答案:

答案 0 :(得分:1)

save函数返回一个模型。如果您愿意,可以继续修改它。

但是,当你回来的模型实例总是与你保存的模型实例完全相同时,我无法想象什么时候不继续改变原始模型是真的有用。出于同样的原因,你什么时候会改变原始文件,保存它,再次变异,然后再次保存?我没有想出任何可以在你的例子中编写代码的场景。

如果使用新选项调用findOneAndUpdate,则突然返回的模型实例变得有用,因为它是文档的新副本(可能已由另一个客户端进行了更改)。