gpt4 book ai didi

node.js - 将项目添加到混合模式数组时,mongoose.save 的结果不正确

转载 作者:可可西里 更新时间:2023-11-01 10:42:41 27 4
gpt4 key购买 nike

以下是显示问题的函数:

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

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

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

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

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

最佳答案

您可以更改您的 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' });

关于node.js - 将项目添加到混合模式数组时,mongoose.save 的结果不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34175620/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com