首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >向混合架构数组添加项时,mongoose.save的结果是不正确的。

向混合架构数组添加项时,mongoose.save的结果是不正确的。
EN

Stack Overflow用户
提问于 2015-12-09 09:50:56
回答 1查看 211关注 0票数 2

以下是显示这一问题的函数:

代码语言:javascript
复制
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":obj: [ { name: 'Modified' }, { name: 'other' } ]中第一项的"Modified“。但是,在数据库中,第一个项的值仍然是"Original“。

只有在将第二项推到数组中时才会发生这种情况(否则第一项确实会被修改)。添加markModified确实解决了这个问题。

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

是虫子吗?我找到的唯一解决办法是清除数组并再次添加所有项。我想知道是否有更好的解决办法。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-09 14:56:38

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

代码语言:javascript
复制
res.obj[0].name = 'Modified';
res.obj.push({ name: 'other' });
res.markModified('obj.0');

或者切换到使用set数组访问方法通知name (这看起来很愚蠢,但确实有效):

代码语言:javascript
复制
res.obj[0].name = 'Modified';
res.obj.set(0, res.obj[0]);
res.obj.push({ name: 'other' });
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34175620

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档