_.extend忽略MEAN Stack中的属性

时间:2016-10-21 10:14:26

标签: javascript mongodb mongoose mean-stack database

我正在尝试覆盖MongoDB中的现有Object。一个月工作正常。现在我的_.extend()忽略了一个属性。该文件的架构是:

var KlausurSchema = new Schema(
    {
        name: String,
        pruefer: {
            eins: String,
            zwei: String
        },
        datum: {
            start: Date,
            dauer: Number
        },
        notenspiegel: {
            von: [Number],
            bis: [Number]
        },
        aufgaben: [{
            name: String,
            punkte: Number
        }],
        studenten: [{
            matrnr: Number,
            status: String,             //Krank/Abgemdelet/Verfügbar
            vorname: String,
            nachname: String,
            bewertung: Number,
            pversuch: Number,
            pvermerk: String,
            freiverm: String,
            labnr: Number,
            porgnr: Number,
            aenddat: String,
            punkte: [],
            gesamtPunkte: Number,
            stapel: Number,
            studiengang: String,
            importID: String,           //um einzelne Importe zu löschen
            korrekturAnzahl: Number     //um Nachkorrigierte zu exportieren
        }],
        imports: [{
            id: String,
            datum: Date,
            studiengang: String,
            anzahl: Number
        }],
        hoersaele: [Object],
        aenderdat: Date

    }
    )
    ;

我做了以下事情。使用PUT-Method我加载这个函数:

    exports.put = function (req, res){
    Klausur.load(req.params.klausurId, function (err, klausur) {

        console.log(req.body);
        console.log("________________________________________");
        klausur = _.extend(klausur, req.body);
        console.log(klausur);



        klausur.save(function (err) {
            res.jsonp(klausur);
        });

        emitChange();
    });

就像我说的,它运作良好。但是如果我输入这个(来自req.body的输出):

{ _id: '5809da4c3a81b8341abf8f51',           
  name: 'Analysis',                          
  aenderdat: '2016-10-21T09:05:16.350Z',     
  __v: 4,                                    
  hoersaele:                                 
   [ { _id: '58074b1f495b58d018116983',      
       name: 'Aula2',                        
       kapazitaet: 10,                       
       puffer: 2,                            
       adresse: 'isauhsda',                  
       hausmeister: 'sydkl',                 
       telefon: '203',                       
       aenderdat: '2016-10-21T08:03:44.660Z',
       __v: 0,                               
       belegung: [Object] } ],               
  imports:                                   
   [ { id: 'i1e6rdi0lq',                     
       datum: '2016-10-21T09:05:39.886Z',    
       studiengang: 'Maschi',                
       anzahl: 3,                            
       _id: '5809da633a81b8341abf8f63' },    
     { id: 'gjd84dtgho',                     
       datum: '2016-10-21T09:16:34.429Z',    
       studiengang: 'WirtIng',               
       anzahl: 6,                            
       _id: '5809dcf23a81b8341abf8f67' } ],  
  studenten: ...

它导出显示了这个(在_.extend()之后从klausur输出):

 imports:                                                                                      
  [ { _id: 5809da633a81b8341abf8f63,                                                           
      anzahl: 3,                                                                               
      studiengang: 'Maschi',                                                                   
      datum: Fri Oct 21 2016 11:05:39 GMT+0200 (Mitteleuropäische Sommerzeit),                 
      id: 'i1e6rdi0lq' },                                                                      
    { _id: 5809dcf23a81b8341abf8f67,                                                           
      anzahl: 6,                                                                               
      studiengang: 'WirtIng',                                                                  
      datum: Fri Oct 21 2016 11:16:34 GMT+0200 (Mitteleuropäische Sommerzeit),                 
      id: 'gjd84dtgho' } ],                                                                    
 hoersaele: [],                                                                                
 __v: 4,                                                                                       
 aenderdat: Fri Oct 21 2016 11:05:16 GMT+0200 (Mitteleuropäische Sommerzeit),                  
 name: 'Analysis',                                                                             
 _id: 5809da4c3a81b8341abf8f51 } 

我遗弃了不重要的财产。我只是想告诉你“Hoersaele”属性没有转移到上传到数据库的新对象。

MongoDB给了我这个错误信息:

{ [ValidationError: Klausur validation failed]
  message: 'Klausur validation failed',
  name: 'ValidationError',
  errors:
   { hoersaele:
      { [CastError: Cast to Array failed for value "[object Object]" at path "hoersaele"]
        message: 'Cast to Array failed for value "[object Object]" at path "hoersaele"',
        name: 'CastError',
        kind: 'Array',
        value: [Object],
        path: 'hoersaele',
        reason: undefined } } }

有什么建议吗?谢谢!

1 个答案:

答案 0 :(得分:1)

我看到不止一种可能的解释或错误:

1。在您的架构中,您定义了hoersaele: [Object]但Mongoose未定义Object类型:SchemaTypes

如果没有验证,您应该使用:hoersaele: [Schema.Types.Mixed]

或者可以为此定义另一个模式并在其中使用它:hoersaele: [HoersaeleSchema]

或者可以将它们存储在另一个集合中,只需引用它们并在想要检索完整模型时使用Mongoose的populate功能:hoersaele: [Schema.Types.ObjectId]

2。您似乎尝试使用Document扩展req.body本地对象,这是一个普通的javascript对象。

如果要点在普通的javascript对象中合并它们,你应该使用Document#toObject([options])来检索普通的javascript对象。

此代码应该有效:

let mergedKlausur = _.extend(klausur.toObject(), req.body);

3。如果您想使用req.body更新现有模型,我认为您应该使用:

klausur.update({$set: req.body});