我使用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中。但是,location
和slides
条目尚不存在,将与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请求中为slides
和location
创建外键对象?