_.extend игнорирует свойство в стеке MEAN

#javascript #mongodb #mongoose #mean-stack #database

#javascript #mongodb #mongoose #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: ...
  

он экспортирует, показывает мне это (вывод из klausur после _.extend()):

  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:

Я вижу более одного возможного объяснения или ошибки:

1. В вашей схеме вы определяете, hoersaele: [Object] но Mongoose не определяет Object тип: SchemaTypes.

Для отсутствия проверки вам следует использовать: hoersaele: [Schema.Types.Mixed] .

Или, может быть, определите для этого другую схему и используйте ее внутри: hoersaele: [HoersaeleSchema] .

Или, может быть, сохраните их в другой коллекции и просто ссылайтесь на них и используйте populate функцию Mongoose, когда вы хотите получить полную модель: hoersaele: [Schema.Types.ObjectId] .

2. Кажется, вы пытаетесь расширить Document который является собственным объектом с помощью req.body , который является простым объектом javascript.

Если цель состоит в том, чтобы объединить их в простой объект javascript, вам следует использовать Document#ToObject([параметры]) для извлечения простого объекта javascript.

Этот код должен работать:

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

3. Если вы хотите обновить существующую модель с помощью req.body , я думаю, вам следует просто использовать:

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