Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 猫鼬/猫鼬。无法保存字符串数组_Arrays_String_Node.js_Mongodb_Mongoose - Fatal编程技术网

Arrays 猫鼬/猫鼬。无法保存字符串数组

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

UPD:

终于找到了这个。下面的代码完全有效。另一个模块中的Layouts.blocks刚刚进行了破坏性更新

这里发生了一些非常奇怪的事情

下面是布局模式的相关部分

和.预保存另一个模型的中间件代码

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