【问题标题】:Result of mongoose.save is incorrect when adding item to mixed schema array将项目添加到混合模式数组时,mongoose.save 的结果不正确
【发布时间】:2016-03-14 12:54:30
【问题描述】:

以下是显示问题的函数:

var mongoose = require('mongoose');
var connection = mongoose.createConnection('mongodb://localhost:27017');

connection.once('open', function () {
  var schema = new mongoose.Schema({
    obj: [{}] //mongoose.Schema.Types.Mixed
  });

  var Model = connection.model('mtest', schema);
  var model = new Model({
    obj: [{ name: 'Original' }]
  });

  model.save(function (err, res) {
    console.log('result 1', res);

    Model.findOne({_id: res._id}, function (err, res) {
      res.obj[0].name = 'Modified';
      res.obj.push({ name: 'other' });
      //res.markModified('obj'); // using markModified does not help

      res.save(function (err, res) {
        console.log('result 2', res);
        connection.close();
        process.exit();
      });
    });
  })
});

“结果 2”的输出显示“obj”中第一项的“Modified”:obj: [ { name: 'Modified' }, { name: 'other' } ]。 但是,在数据库中,第一项的值仍然是“Original”。

这仅在将第二项推入数组时发生(否则确实修改了第一项)。 添加markModified 确实可以解决问题。

我在模式中使用了一个空对象类型数组,因为实际上这个用例处理的是相互继承的模式,所以这里不能使用单一模式。

这是一个错误吗?我发现的唯一解决方法是清除数组并再次添加所有项目。我想知道是否有更好的解决方案。

【问题讨论】:

    标签: node.js mongodb mongoose mongoose-schema


    【解决方案1】:

    您可以更改您的 markModified 调用以识别您在数组访问方法“外部”更改的元素的索引:

    res.obj[0].name = 'Modified';
    res.obj.push({ name: 'other' });
    res.markModified('obj.0');
    

    或者切换到使用set数组访问方法来提醒name(看起来很傻,但确实有效):

    res.obj[0].name = 'Modified';
    res.obj.set(0, res.obj[0]);
    res.obj.push({ name: 'other' });
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-29
    • 2015-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多