我如何在另一个模型中创建新模型?

时间:2021-05-20 08:42:38

标签: node.js mongodb mongoose

我有 TweetModel,我需要在里面创建 RatingModel,而且 RatingModel 必须有相同的 TweetModel id,因为我想链接它们以进一步删除。 也许还有其他方法可以为猫鼬中的帖子评分。 我将非常感谢您的帮助

const tweet = await TweetModel.create({
      text: req.body.text,
      images: req.body.images,
      user: user._id,
      rating: ..., // => {retweets[], likes[]}
    })
    tweet.save()

TweetSchema

RatingSchema

1 个答案:

答案 0 :(得分:0)

假设您已经知道如何创建架构,您可以为推文和评分创建 2 种不同的架构。这将创建 2 个独立的集合,从而更易于管理。

const { text, images } = req.body

const objectId = new mongoose.Types.ObjectId() //create a objectId first.

await TweetModel.updateOne({ _id }, { text, images, user: user._id }, { upsert: true })
await RatingModel.updateOne(....)

我们在这里使用 updateOne 并带有 {upsert: true} 选项,如果记录 _id 不存在,我们将在其中创建新记录。

您可以使用 mongoose.populate()

轻松获得评分

更多关于 { upsert: true } - https://docs.mongodb.com/manual/reference/method/db.collection.update/

奖金

如果你想用一半的时间创建记录。

const [ tweet, rating ] = await Promise.all([
      TweetModel.updateOne({ _id }, { text, images, user: user._id }, { upsert: true })
      RatingModel.updateOne(....)
])

使用 Promise.all 可以同时执行两个更新请求。

奖励 2

如果您想在推文中填充评分,请将其添加到您的架构中..

TweetModel.virtual('rating', {
  ref: 'Rating',
  localField: '_id',
  foreignField: '_id',
});

滚动到填充 - https://mongoosejs.com/docs/tutorials/virtuals.html