2012-07-05 91 views
0

当使用这种user.meta.logins.$inc();我得到这个错误在控制台:MongooseJS不能更新数值

Mongoose MongooseNumber#$inc/MongooseNumber#increment is deprecated. Use Model.update() to get incrementation in v3 instead.

我所斋做的是这个(代码被剥离下来的基本用法):

userSchema.methods = { 
    userFind : function (user, pass, callback) { 
    this.model('user').findOne({ 'username':user, 'password':pass }, callback); 
    } 
} 

var userModel = new model(); 
userModel.userFind(username, password, function(err, user) { 
    user.meta.logins.$inc(); 
    user.meta.last_action = new Date();     
    user.save(); 
}); 

这工作得很好,但由于弃用即将到来,我想使用建议的Model.update()方法来更新用户,但我无法做到这一点。

我试过做userModel.update()user.update()但在两种情况下我都会收到错误。也许我的语法是错误的更新。

任何想法将不胜感激。

回答

0

要查看这使用update

userModel.update(
    { 'username': user, 'password': pass }, 
    { $inc: { logins: 1 }, $set: { last_action: new Date() }}, 
    function(err, numAffected) { 
    ... 
}); 
+0

那我已经试过了,谢谢你。它产生这个错误: '对象{}没有方法'更新'' – Evenflow 2012-07-05 13:46:58

+0

我假设'userModel'是你的Model类的用户,但是这一行让我感到困惑:'var userModel = new model();'你应该从'mongoose.model('user',userSchema)''调用返回的对象上调用'update';'注册模式的地方。 – JohnnyHK 2012-07-05 14:08:23

+0

是的,这就是我所做的,'var userModel = new model();'只是一个返回模型和连接的包装器。你可能会看到,我正在调用Schema('userModel.userFind')的一个方法,并且工作得很好,所以我的包装返回模型和连接就好了。 – Evenflow 2012-07-05 14:46:03

0

因此,这此问题和解决方法:

当你定义Schema.methods你必须按顺序使用它们来创建模型的实例:

var myModel = new Model(); 
myModel.mySchemaMethod(); 

由于模型自己的方法(如Model.update)不再可访问,所以会导致问题。

在这种情况下,方法应定义为静态的,因此不需要实例,并将其所有工作得很好:

myModel.mySchemaStatic();