【问题标题】:Does MongooseJS return a new fresh result object on save()?MongooseJS 是否在 save() 上返回一个新的结果对象?
【发布时间】:2015-07-18 06:04:09
【问题描述】:

默认情况下,集合.save() 上的 MongoDB 返回一个 WriteResult 对象,如文档中所述:

The save() returns a WriteResult object that contains the status of the insert or update operation.

但是使用 Mongoose(我猜是节点中的底层 mongodb 驱动程序),您可以添加第二个参数,该参数填充了您刚刚插入的整个对象和新的 _id:

var user = new User(req.body);

user.save(function (err, userResult) {
    if (err) {
        log.error(err);
    }
    log.debug('User data: ', userResult);
});

所以我的问题: userResult 是否包含从 Mongo 检索到的数据并且它是一个新对象,或者传递给 save() 方法并且来自数据库调用的对象是否仅与生成的 _id 和/或创建日期等部分数据合并?

【问题讨论】:

    标签: node.js mongodb mongoose


    【解决方案1】:

    如果你看看Model.prototype.save()

    https://github.com/Automattic/mongoose/blob/8cb0e35/lib/model.js#L254

    看起来您在 userResult 中返回了相同的模型实例 (self)。

    【讨论】:

    • 我正在使用 3.8 .. 我不明白发生了什么github.com/Automattic/mongoose/blob/3.8.x/lib/model.js#L167
    • 它仍然返回相同的 selfnumAffected,但它在内部使用了 Promise。在Model.prototype.save() 中有一个complete 函数,通过handleSave 辅助方法创建。当这个被调用时,只要第一个 err 参数为空,它就会以同样的方式解决。你可以在这里看到它:github.com/Automattic/mongoose/blob/3.8.x/lib/model.js#L133
    • 我做了一些测试,我有这段代码: var bigMessage = '{ ... 4kb of data here .. }'; var message = new Message(bigMessage); message.save(function (err, theMessage) { if (err) { console.log('err', err); } console.log('message: ', theMessage); });使用mongostat 我在netIn netOut 部分看到了这些值: netIn 5k netOut 4k 这不是说数据返回到节点应用了吗?
    【解决方案2】:

    为了回答您的问题,返回的对象是一个新对象——不是原来的对象(所以user != userResult

    Mongoose 支持一些 options -- new: truelean: false 设置可能对您感兴趣,以修改数据在不同操作中的返回方式(如果您希望它是一个新选项或不关心) .

    您可以使用以下方法验证此“新对象”是否属实:

    var user = new User(req.body);
    
    user.save(function (err, userResult) {
        if (err) {
            log.error(err);
        }
    
        user.name = 'TEST';
        console.log(`${userResult.name} will be undefined but ${user.name} will not be`);
        log.debug('User data: ', userResult);
    });
    

    【讨论】:

      猜你喜欢
      • 2019-07-10
      • 1970-01-01
      • 1970-01-01
      • 2017-09-10
      • 2019-02-20
      • 2019-09-20
      • 1970-01-01
      • 2014-04-10
      • 1970-01-01
      相关资源
      最近更新 更多