首页 > 解决方案 > 在模式中包含子模式似乎不适用于猫鼬

问题描述

这就是我定义子模式和模式的方式

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'
}

我从互联网上的几个来源中了解到子模式(又名子文档)的想法是可能的。但是,当我尝试如上所示实现它时,它无法工作。这背后的原因是什么?

标签: javascriptnode.jsmongodbmongooseschema

解决方案


该错误看起来像您正在分配一个字符串jobs而不是数组对象。我认为你目前正在保存的是

{
    username: "France",
    jobs: "[{jobname: Google, jobstatus: applied}]" // the whole array as string
}

你应该保存的是

{
    username: "France",
    jobs: [{jobname: "Google", jobstatus: "applied"}]
}

请控制台记录req.body.jobs并检查它是否是正确的 JSON 数组


推荐阅读