【问题标题】:Mongoose update without callback没有回调的猫鼬更新
【发布时间】:2013-01-14 20:27:27
【问题描述】:

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

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);

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

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

这行得通:

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

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

注意:我正在通过电子邮件匹配测试建议,我在 NodeJS v0.8.17 中使用猫鼬 v3.5.4 和简单的 Express v3.0.6 设置。

提前致谢。

【问题讨论】:

    标签: node.js mongodb express mongoose


    【解决方案1】:

    用猫鼬调用update的正确方法如下:

    User.update(query, update).exec(callback);
    

    这样你就可以跳过callback:

    User.update(query, update).exec();
    

    当你打电话时

    User.update(query, update)
    

    它返回一个query object。

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

    User.find(query).limit(12).exec(callback);
    

    Update 使用相同的机制,尽管它在那里用处不大。

    【讨论】:

    • 你说的完全正确,我现在在 Mongoose 的文档中看到了关于此的注释 (gan.so/diUO)。昨天我瞎了,谢谢指点。
    • 虽然令人困惑的是,如果您提供回调,查询会立即执行而不是返回查询对象。我认为他们需要对此进行更改或在文档中进行备注。
    • 此功能已针对find 操作进行了详细记录(请参阅API docs 和guide),但不适用于update。从update API docs 看来callback 是必需参数,但它不是。
    猜你喜欢
    • 2015-10-08
    • 2021-12-31
    • 2016-07-13
    • 2018-10-28
    • 2017-04-29
    • 2012-03-28
    • 2020-07-13
    相关资源
    最近更新 更多