Node + Mongoose:在POST上创建外键对象

时间:2019-06-09 13:13:07

标签: node.js database mongodb mongoose foreign-keys

我使用mongoose在node.js项目中设置了以下模型:

const TalkSchema = Schema({

    _id: Schema.Types.ObjectId,
    name: String,
    location: { type: Schema.Types.ObjectId, ref: 'Location'},
    date: Date,
    person: { type: Schema.Types.ObjectId, ref: 'Person'},
    slides: { type: Schema.Types.ObjectId, ref: 'Link'},
})

const LocationSchema = mongoose.Schema({

    _id: Schema.Types.ObjectId,
    name: String,
    address: String,
})

const LinkSchema = Schema({

    _id: Schema.Types.ObjectId,
    url: String,
    name: String,
})

我正在尝试通过发送带有以下正文的POST请求来将Talk记录保存到数据库中:

    {
        "name": "Some name",
        "location": { "name": "a location name", "address": "123 Fake St, Surry Hills NSW 2010" },
        "date": "2019-05-29 18:00:00.000Z",
        "slides": {
            "url": "https://github.com/mygithub/link",
            "name": "Google Slides for the talk"
        },
    }

person不需要指定,因为它属于先前创建的记录并且包含在URL中。但是,locationslides条目尚不存在,将与Talk记录一起创建。

起初,我认为我可以创建一个嵌套的JSON对象(例如下面显示的location键值对)。它将ObjectId存储为位置键的值,但是,它没有创建与其关联的记录。

然后,我认为我可以将JSON对象包装在模型的构造函数中(如slides键值对所示)。但是,这导致了类似的行为。

router.post('/person/:personId/talk', (req, resp) => {

  const person = req.params.personId

  const talk = new TalkModel({
    _id: new mongoose.Types.ObjectId(),
    name: req.body.name,
    location: {
        _id: new mongoose.Types.ObjectId(), 
        name: req.body.location.name, 
        address: req.body.location.address,
    },
    date: req.body.date,
    person: person,
    slides: new LinkModel({
      _id: new mongoose.Types.ObjectId(),
      url: req.body.slides.url,
      name: req.body.slides.name,
    }),
  })

  talk.save().then(result => {
    resp.status(201).json(result)
  }).catch(err => {
    console.log(err)
    resp.status(500).send(err)
  })
})

在谷歌搜索之后,我发现了一个使用异步函数创建外键的示例,如下所示:

async function create(name, address){
  const id = new mongoose.Types.ObjectId()
  new LocationModel({
    _id: id,
    name: name,
    address: address,
  })

  const result = await location.save()
  console.log("Created Location: " + result)
}

但是,尚不清楚该示例是否放置该代码,如何调用它或如何获取新创建的ObjectId以便能够将其链接到当前记录。我尝试在模型下编写该函数,然后返回ObjectId,但它返回一个Promise(我假设是因为它是一个异步函数)。

所以我的问题是,如何在创建通话记录的同一POST请求中为slideslocation创建外键对象?

0 个答案:

没有答案