_.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});
我正在尝试覆盖 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});