Mongoose,使用对象数组快速创建模式

Kry*_*ras 5 mongoose mongodb node.js express

我尝试创建包含对象数组的猫鼬模式。架构看起来像:

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
})
Run Code Online (Sandbox Code Playgroud)

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

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

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

{
    "name": "ergergergg",
    "description": "rgergrg",
    "places": [
        {
            "name":"cvcv",
            "description":"rgergrg",
            "lat":233,
            "lng":232
        }]
}
Run Code Online (Sandbox Code Playgroud)

错误:

ValidationError: places: Cast to Array failed for value "[object Object]" at path "places"
Run Code Online (Sandbox Code Playgroud)

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

Gré*_*EUT 11

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

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

插入新数据

mapSchema.insert({
   name: "ergergergg",
   description: "rgergrg",
   places: [
        {
            name: "cvcv",
            description": "rgergrg",
            lat: 233,
            lng: 232,
        },
   ],
});
Run Code Online (Sandbox Code Playgroud)

  • 这是一个非常有用的答案。谢谢,它基本上解决了我的问题。我只是有一个问题,如何使地方数组可选?谢谢。 (2认同)