我正在尝试覆盖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: ...


它的导出向我显示了此信息(_.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.似乎您尝试将Document(它是本机对象)扩展为req.body(这是普通javascript对象)。

如果重点是将它们合并到纯JavaScript对象中,则应使用Document#toObject([options])来检索纯javascript对象。

此代码应工作:

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


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

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

09-25 13:31