没有回调的Mongoose更新

Ser*_*món 11 mongoose mongodb node.js express

我有一个典型的架构和模型:

var mongoose = require('mongoose');

var userSchema = new mongoose.Schema({
    email: String,
    password: String,
    profile: {
        name: String,
        surname: String,
        photo: String
    },
    stats: {
        lastLogin: { type: Date, default: Date.now },
        loginCount: Number,
        lastIP: String
    },
    source: String,
    deleted: Boolean,
    dateCreated: { type: Date, default: Date.now }
});

mongoose.model('User', userSchema);
Run Code Online (Sandbox Code Playgroud)

当我执行此更新时,它仅在我定义回调时有效,否则它只是执行但在数据库中没有更改值:

User.update({email:'foo@bar.com'}, {$inc: {'stats.loginCount': 1}});
Run Code Online (Sandbox Code Playgroud)

这有效:

User.update({email:'foo@bar.com'}, {$inc: {'stats.loginCount': 1}}, function() {});
Run Code Online (Sandbox Code Playgroud)

这是一个错误吗?我没有在文档中看到是否需要回调但是要求这个很奇怪......我想我在这里遗漏了一些东西.

注意:我正在通过电子邮件进行测试建议,我在NodeJS v0.8.17中使用mongoose v3.5.4,并使用简单的Express v3.0.6设置.

提前致谢.

Leo*_*tny 23

update用mongoose 调用的正确方法如下:

User.update(query, update).exec(callback);
Run Code Online (Sandbox Code Playgroud)

这样您就可以跳过callback:

User.update(query, update).exec();
Run Code Online (Sandbox Code Playgroud)

当你打电话

User.update(query, update)
Run Code Online (Sandbox Code Playgroud)

它返回一个查询对象.

查询数据库时非常有用,因为您可以在执行查询对象之前对其进行操作.例如,您可以limitfind查询指定a :

User.find(query).limit(12).exec(callback);
Run Code Online (Sandbox Code Playgroud)

Update 使用相同的机制,虽然它不那么有用.

  • 这个功能在`find`操作中有详细记录(参见[API docs](http://mongoosejs.com/docs/api.html#query_Query-find)和[guide](http://mongoosejs.com/docs /queries.html)),但不适用于`update`.从[`update`API docs](http://mongoosejs.com/docs/api.html#query_Query-update)看来,`callback`似乎是必需的参数,但事实并非如此. (3认同)
  • 尽管令人困惑的是,如果您提供回调,查询将立即执行,而不是返回查询对象。我认为他们需要更改此设置或在文档中进行注释。 (2认同)