_.extend 忽略 MEAN Stack 中的 属性

_.extend ignores a property in MEAN Stack

我正在尝试覆盖 MongoDB 中的现有对象。它工作了一个月。现在我的 _.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 方法我加载了这个函数:

    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: ...

it exports 向我展示了这个(_.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。在您的模式中,您定义了 hoersaele: [Object] 但 Mongoose 没有定义 Object 类型:SchemaTypes.

如果不进行验证,您应该使用:hoersaele: [Schema.Types.Mixed].

或者为它定义另一个模式并在内部使用它:hoersaele: [HoersaeleSchema].

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

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

如果要将它们合并到一个普通的 javascript 对象中,您应该使用 Document#toObject([options]) 来检索普通的 javascript 对象。

此代码应该有效:

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

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

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