Arrays 猫鼬/猫鼬。无法保存字符串数组
UPD: 终于找到了这个。下面的代码完全有效。另一个模块中的Layouts.blocks刚刚进行了破坏性更新 这里发生了一些非常奇怪的事情 下面是布局模式的相关部分 和.预保存另一个模型的中间件代码Arrays 猫鼬/猫鼬。无法保存字符串数组,arrays,string,node.js,mongodb,mongoose,Arrays,String,Node.js,Mongodb,Mongoose,UPD: 终于找到了这个。下面的代码完全有效。另一个模块中的Layouts.blocks刚刚进行了破坏性更新 这里发生了一些非常奇怪的事情 下面是布局模式的相关部分 和.预保存另一个模型的中间件代码 Map.pre('save', function(next){ var that = this; var Layouts = connection.model('layouts'); var openFields = ['one', 'two']; Layouts.find({_co
Map.pre('save', function(next){
var that = this;
var Layouts = connection.model('layouts');
var openFields = ['one', 'two'];
Layouts.find({_company: that._company, object: that._id, default: true}, function(err, layouts){
if (err) return next(err);
var layout = layouts[0];
console.log(layout.blocks);
layout.blocks.set(0, {full: false, fields: openFields});
layout.markModified('blocks');
console.log(layout.blocks);
layout.save(function(err){
console.log('saved: ', err);
next(err);
});
});
});
console.log值为
[{ full: true, _id: 54147307f07097462fb93912, fields: [] }]
[{ full: false,
_id: 54147307f07097462fb93918,
fields: [ 'one', 'two' ] }]
saved: null
然后我检查保存的布局并获得:
blocks: [ { full: false, _id: 54147307f07097462fb93918, fields: [] } ],
因此,\u id和full已保存,但字段未保存
如果我使用直接更新,也会发生类似的情况
Layouts.update({_company: that._company, object: that._id, default: true},
{$set: {'blocks.0.fields': openFields}},
function(err){
next(err);
});
有什么建议吗?我尝试实现与您指定的模式相同的模式,并尝试用三种不同的方式更新布局对象,所有这些方法都有效。这是我的实现和测试。从你提交的代码中看不出你错在哪里
var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/layout-test');
var LayoutSchema = new mongoose.Schema({
blocks: [{
full: {type: Boolean},
fields: [{
type: String
}],
}],
});
var Layout = mongoose.model('Layout', LayoutSchema);
var LAYOUT_DATA = {
blocks: [
{full: true},
],
};
// Updating the object, setting the first item of blocks
var test1 = function() {
new Layout(LAYOUT_DATA).save(function(err, layout) {
Layout.update({
_id: layout._id
}, {
$set: {
'blocks.0.full': false,
'blocks.0.fields': ['one', 'two'],
},
}, function(err, nbrOfUpdates) {
Layout.findById(layout._id, function(err, layout) {
if (layout.blocks[0].fields.length === 0) {
throw Error();
}
});
});
});
};
// Replacing the old blocks with a new array
var test2 = function() {
new Layout(LAYOUT_DATA).save(function(err, layout) {
layout.blocks = [{
full: false,
fields: ['one', 'two'],
}];
layout.save(function(err, layout) {
if (layout.blocks[0].fields.length === 0) {
throw Error();
}
});
});
};
// Pushing a new object to the blocks array and splicing away the old one
var test3 = function() {
new Layout(layout).save(function(err, layout) {
layout.blocks.push({
full: false,
fields: ['one', 'two'],
});
layout.blocks.splice(0, 1);
layout.save(function(err, layout) {
if (layout.blocks[0].fields.length === 0) {
throw Error();
}
});
});
};
是的,我只是想不出有什么会让手术失败。。。即使有什么东西可以触发错误,比如说,没有什么东西会在某处抛出错误。无论如何,谢谢你的尝试。
var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/layout-test');
var LayoutSchema = new mongoose.Schema({
blocks: [{
full: {type: Boolean},
fields: [{
type: String
}],
}],
});
var Layout = mongoose.model('Layout', LayoutSchema);
var LAYOUT_DATA = {
blocks: [
{full: true},
],
};
// Updating the object, setting the first item of blocks
var test1 = function() {
new Layout(LAYOUT_DATA).save(function(err, layout) {
Layout.update({
_id: layout._id
}, {
$set: {
'blocks.0.full': false,
'blocks.0.fields': ['one', 'two'],
},
}, function(err, nbrOfUpdates) {
Layout.findById(layout._id, function(err, layout) {
if (layout.blocks[0].fields.length === 0) {
throw Error();
}
});
});
});
};
// Replacing the old blocks with a new array
var test2 = function() {
new Layout(LAYOUT_DATA).save(function(err, layout) {
layout.blocks = [{
full: false,
fields: ['one', 'two'],
}];
layout.save(function(err, layout) {
if (layout.blocks[0].fields.length === 0) {
throw Error();
}
});
});
};
// Pushing a new object to the blocks array and splicing away the old one
var test3 = function() {
new Layout(layout).save(function(err, layout) {
layout.blocks.push({
full: false,
fields: ['one', 'two'],
});
layout.blocks.splice(0, 1);
layout.save(function(err, layout) {
if (layout.blocks[0].fields.length === 0) {
throw Error();
}
});
});
};