【问题标题】:Mongoose, express- create schema with array of objectsMongoose,express-创建带有对象数组的模式
【发布时间】:2018-02-28 08:01:18
【问题描述】:

我尝试创建包含对象数组的猫鼬模式。架构如下:

const mapSchema = new Schema({
  name: {
    type: String
  },
  description: {
    type: String
  },
  rate: {
    type: Number,
    default: 0
  },
  sumOfRates: {
    type: Number,
    default: 0
  },
  places: [
    {
      name: String,
      description: String,
      difficulty: { type: String, default: 0 },
      sumOfRates: { type: String, default: 0 },
      lat: Number,
      lng: Number
    }
  ]
}, {
  timestamps: true
})

Places 是对象数组。我尝试创建猫鼬模式并将其用作地点数组的元素(地点:[ref:'placeSchema'])。

const placeSchema = new Schema({
  name: {
    type: String
  },
  description: {
    type: String
  },
  difficulty: {
    type: Number,
    default: 0
  },
  lat: {
    type: Number
  },
  lng: {
    type: Number
  }
})

但我认为它会在 mongo(放置文档)中创建另一个单独的文档。可以?我尽量避免这种情况将它保存在一个文档中。现在(上面粘贴的代码),当我尝试在邮递员中插入 json 时,给我一个错误:

{
    "name": "ergergergg",
    "description": "rgergrg",
    "places": [
        {
            "name":"cvcv",
            "description":"rgergrg",
            "lat":233,
            "lng":232
        }]
}

错误:

ValidationError: places: Cast to Array failed for value "[object Object]" at path "places"

为什么会出现这样的错误?如何解决这个问题?

【问题讨论】:

    标签: node.js mongodb express mongoose


    【解决方案1】:

    适当的方法是使用子模式。

    const subSchema = new Schema({
      name: {
        type: String,
      },
      description: {
        type: String,
      },
      difficulty: {
        type: Number,
        default: 0,
      },
      lat: {
        type: Number,
      },
      lng: {
        type: Number,
      },
    });
    

    const mapSchema = new Schema({
      name: {
        type: String,
      },
      description: {
        type: String,
      },
      rate: {
        type: Number,
        default: 0,
      },
      sumOfRates: {
        type: Number,
        default: 0,
      },
      places: [subSchema],
    }, {
      timestamps: true
    });
    

    插入新数据

    mapSchema.insert({
       name: "ergergergg",
       description: "rgergrg",
       places: [
            {
                name: "cvcv",
                description: "rgergrg",
                lat: 233,
                lng: 232,
            },
            {
                name: "22",
                description: "erwer2",
                lat: 123,
                lng: 321,
            },
       ],
    });
    

    【讨论】:

    • 这是一个非常有用的答案。谢谢,它主要解决了我的问题。我只有一个问题,如何使 places 数组变为可选?谢谢。
    • @ThisIsNotAnId 你有没有想过这个问题?
    【解决方案2】:

    要使 subSchema 成为可选,您可以执行类似@DanMossa 的操作:

        pages: {
            type: [subSchema],
            required: false
        },
    

    【讨论】:

      猜你喜欢
      • 2020-03-23
      • 2014-04-10
      • 1970-01-01
      • 2017-09-30
      • 2021-06-21
      • 1970-01-01
      • 2014-12-15
      • 2018-02-07
      • 1970-01-01
      相关资源
      最近更新 更多