【问题标题】:Including subschemas in schemas doesn't seem to work for mongoose在模式中包含子模式似乎不适用于猫鼬
【发布时间】: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


    【解决方案1】:

    错误看起来像您将字符串分配给 jobs 而不是数组对象。我认为您当前正在保存的是

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

    你应该保存的是

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

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

    【讨论】:

    • 谢谢,原来我一直在错误地使用邮递员,顺便说一句,您以前有使用邮递员的经验吗?我只是想问一下,因为出于某种原因,我的服务器似乎没有读取作业数组的内容,只是将其记录为一个空数组。希望有人能帮忙!
    • 好的,你能提供一个邮递员发送的示例请求正文
    【解决方案2】:

    您不能通过将架构存储在“作业”中来在另一个架构中使用它。 您可以参考下面的“jobschema”。

    工作:[{

    类型:Schema.ObjectId, 参考:'JobSchema'

    }]

    【讨论】:

    • 错误:数据验证失败:作业:转换为 [ObjectId] 失败,路径“作业”处的值“[”[{jobname:Google,jobstatus:已应用}]“]”。我仍然收到此错误。
    猜你喜欢
    • 2021-12-18
    • 2015-03-11
    • 2020-06-23
    • 2012-02-02
    • 2016-08-05
    • 2016-07-03
    • 2015-09-21
    • 2022-01-12
    • 2019-02-20
    相关资源
    最近更新 更多