【发布时间】:2020-09-23 18:10:02
【问题描述】:
这就是我定义子模式和模式的方式
const mongoose = require("mongoose");
const Schema = mongoose.Schema;
const JobSchema = new Schema ({
jobname: String,
jobstatus: String
})
const DataSchema = new Schema ({
username: {
type: String,
required: true,
unique: true
},
jobs: [JobSchema]
});
module.exports = mongoose.model("data", DataSchema);
这段代码是利用上面的模式作为模型
const express = require("express");
const router = express.Router();
const Data = require("../../models/Data");
router.post("/", (req, res) => {
const newData = new Data({
username: req.body.username,
jobs: req.body.jobs
});
newData
.save()
.then(data => res.json(data))
.catch(err => console.log(err));
});
module.exports = router;
我尝试输入的数据:
{
username: France,
jobs: [{jobname: Google, jobstatus: applied}]
}
错误:
Error: data validation failed: jobs: Cast to embedded failed for value "'[{jobname: Google, jobstatus: applied}]'" at path "jobs"
at ValidationError.inspect (/Users/Desktop/server/node_modules/mongoose/lib/error/validation.js:48:26)
at formatValue (internal/util/inspect.js:723:31)
at inspect (internal/util/inspect.js:289:10)
at formatWithOptionsInternal (internal/util/inspect.js:1918:40)
at formatWithOptions (internal/util/inspect.js:1802:10)
at Object.Console.<computed> (internal/console/constructor.js:304:10)
at Object.log (internal/console/constructor.js:314:61)
at /Users/Desktop/server/routes/api/data.js:14:31
at processTicksAndRejections (internal/process/task_queues.js:97:5) {
errors: {
jobs: CastError: Cast to embedded failed for value "'[{jobname: Google, jobstatus: applied}]'" at path "jobs"
at DocumentArrayPath.cast (/Users/Desktop/server/node_modules/mongoose/lib/schema/documentarray.js:449:19)
at DocumentArrayPath.cast (/Users/Desktop/server/node_modules/mongoose/lib/schema/documentarray.js:378:17)
at DocumentArrayPath.SchemaType.applySetters (/Users/Desktop/server/node_modules/mongoose/lib/schematype.js:1031:12)
at model.$set (/Users/Desktop/server/node_modules/mongoose/lib/document.js:1203:20)
at model._handleIndex (/Users/Desktop/server/node_modules/mongoose/lib/document.js:979:14)
at model.$set (/Users/Desktop/server/node_modules/mongoose/lib/document.js:920:22)
at model.Document (/Users/Desktop/server/node_modules/mongoose/lib/document.js:137:12)
at model.Model (/Users/Desktop/server/node_modules/mongoose/lib/model.js:106:12)
at new model (/Users/Desktop/server/node_modules/mongoose/lib/model.js:4695:15)
at /Users/Desktop/server/routes/api/data.js:7:21
at Layer.handle [as handle_request] (/Users/Desktop/server/node_modules/express/lib/router/layer.js:95:5)
at next (/Users/Desktop/server/node_modules/express/lib/router/route.js:137:13)
at Route.dispatch (/Users/Desktop/server/node_modules/express/lib/router/route.js:112:3)
at Layer.handle [as handle_request] (/Users/Desktop/server/node_modules/express/lib/router/layer.js:95:5)
at /Users/Desktop/server/node_modules/express/lib/router/index.js:281:22
at Function.process_params (/Users/Desktop/server/node_modules/express/lib/router/index.js:335:12) {
stringValue: `"'[{jobname: Google, jobstatus: applied}]'"`,
messageFormat: undefined,
kind: 'embedded',
value: "'[{jobname: Google, jobstatus: applied}]'",
path: 'jobs',
reason: ObjectParameterError: Parameter "obj" to Document() must be an object, got [{jobname: Google, jobstatus: applied}]
at EmbeddedDocument.Document (/Users/Desktop/server/node_modules/mongoose/lib/document.js:90:11)
at EmbeddedDocument [as constructor] (/Users/Desktop/server/node_modules/mongoose/lib/types/embedded.js:42:12)
at new EmbeddedDocument (/Users/Desktop/server/node_modules/mongoose/lib/schema/documentarray.js:115:17)
at DocumentArrayPath.cast (/Users/Desktop/server/node_modules/mongoose/lib/schema/documentarray.js:442:22)
at DocumentArrayPath.cast (/Users/Desktop/server/node_modules/mongoose/lib/schema/documentarray.js:378:17)
at DocumentArrayPath.SchemaType.applySetters (/Users/Desktop/server/node_modules/mongoose/lib/schematype.js:1031:12)
at model.$set (/Users/Desktop/server/node_modules/mongoose/lib/document.js:1203:20)
at model._handleIndex (/Users/Desktop/server/node_modules/mongoose/lib/document.js:979:14)
at model.$set (/Users/Desktop/server/node_modules/mongoose/lib/document.js:920:22)
at model.Document (/Users/Desktop/server/node_modules/mongoose/lib/document.js:137:12)
at model.Model (/Users/Desktop/server/node_modules/mongoose/lib/model.js:106:12)
at new model (/Users/Desktop/server/node_modules/mongoose/lib/model.js:4695:15)
at /Users/Desktop/server/routes/api/data.js:7:21
at Layer.handle [as handle_request] (/Users/Desktop/server/node_modules/express/lib/router/layer.js:95:5)
at next (/Users/Desktop/server/node_modules/express/lib/router/route.js:137:13)
at Route.dispatch (/Users/Desktop/server/node_modules/express/lib/router/route.js:112:3)
}
},
_message: 'data validation failed'
}
我从 Internet 上的多个来源了解到子模式(也称为子文档)的想法是可能的。但是,当我尝试如上所示实现它时,它无法工作。这背后的原因是什么?
【问题讨论】:
标签: javascript node.js mongodb mongoose schema