首页 > 解决方案 > 从猫鼬模型传递嵌套的 JSON 数据不起作用

问题描述

我正在将嵌套的 JSON 数据推送到数据库。这就是我的架构的样子,

const mongoose = require('mongoose');
// original Schema

const dataSourceSchema = mongoose.Schema({

    _id: mongoose.Schema.Types.ObjectId,
    name: { type: String, required: true, unique: true },
    type: { type: String, required: true },
    projectId: { type: mongoose.Schema.Types.ObjectId, ref: 'Project', required: true },
    config:{type: String, required: true}

});

module.exports = mongoose.model('DataSource', dataSourceSchema);

我想将以下 json 数据传递给我的 dataSourceSchema,

{
“name”:”JdbcSourceConnector”,
"type" :"string",
“config”: {
“connector.class”:” io.confluent.connect.jdbc.JdbcSourceConnector”,
“tasks.max”:1,
“connection.url”:”<connection to connect to database along with username and password>”,
“mode”:”incrementing”,
“incrementing.column.name”:”<incrementing column name in table>”,
“topic.prefix”:”test-mysql-jdbc-”
}
}

但它不接受,会给出铸造错误或“,”预期。

所以我尝试了这个,

const dataSourceSchema = mongoose.Schema({

    _id: mongoose.Schema.Types.ObjectId,
    name: { type: String, required: true, unique: true },
    type: { type: String, required: true },
    projectId: { type: mongoose.Schema.Types.ObjectId, ref: 'Project', required: true },
    config:{ 
    connector.class:{ type: String, required: true },
tasks.max:{ type: String, required: true },
connection.url:{ type: String, required: true },
mode:{ type: String, required: true },
incrementing.column.name:{ type: String, required: true },
topic.prefix:{ type: String, required: true }
}

});

这个架构也给了我错误,“,”是预期的。

如果我只传递我在原始模式中提到的字符串,则数据将存储在 db 中。但我想传递嵌套的 json 数据,请指导我正确的方向。我也试过stringify数据,它不起作用。

标签: javascriptjsonnode.jsmongoosemongoose-schema

解决方案


正如我所看到的,错误在于用接近答案的第二个模式定义你的模式。更改您的架构如下:

const dataSourceSchema = mongoose.Schema({
      _id: mongoose.Schema.Types.ObjectId,
      name: { type: String, required: true, unique: true },
      type: { type: String, required: true },
      projectId: { type: mongoose.Schema.Types.ObjectId, ref: 'Project', required: true },
      config:{ 
            connectorClass:{ type: String, required: true },
            tasksMax:{ type: String, required: true },
            connectionUrl:{ type: String, required: true },
            mode:{ type: String, required: true },
            incrementingColumnName:{ type: String, required: true },
            topicPrefix:{ type: String, required: true }
      }
});

我建议进行更改,因为 mongoose 不理解其模式的键列中的点表示法,因此您收到了您提到的错误。

如果您出于某种原因想要使用点表示法,则将密钥封装在 " 而不是出现在代码片段中的特殊字符中。

Ps - 不要忘记更改 json 中的键名


推荐阅读