如何使用猫鼬保存文档并更新另一个相互依赖的文档

时间:2020-02-04 23:06:46

标签: node.js mongodb mongoose mongoose-schema

这是我的出价模型。

const BidSchema = new Schema({
  auctionKey: {
    type: mongoose.Types.ObjectId,
    ref: "Auction",
    required: true
  },
  amount: { type: String, required: true },
  userName: { type: String, required: true },
});

这是我的拍卖模型(请注意这两个模型之间的关系)。

const AuctionSchema = new Schema({
  title: { type: String, required: true },
  startDate: { type: Date, required: true },
  closeDate: { type: Date, required: true },
  initialBidAmount: { type: Number, required: true },
  bidIncrementAmount: { type: Number, required: true },
  bids: [
    {
      type: mongoose.Types.ObjectId,
      ref: 'Bid'
    }
  ]
});

当用户为任何拍卖出价时,我将出价保存在投标收藏中,并使用猫鼬findOneAndUpdate更新拍卖收藏。

const postBid = async (req, res, next) => {
  const { auctionKey } = req.body;
  const bid = new BidModel(req.body);
  bid.save(error => {
    if (error) {
      res.status(500).json({ message: "Could not post bid." });
    }
  });

  const aucById = await AuctionModel.findOneAndUpdate(
    { _id: auctionKey },
    { $push: { bids: bid } }
  ).exec((error: any, auction: IAuction) => {
    if (error) {
      res.status(500).json({ message: "Could not post bid." });
    } else {
      res.status(201).json({ bid });
    }
  });
};

由于任何原因,如果这两个出价(savefindOneAndUpdate中的任何一个抛出任何错误,我希望什么都不要保存到数据库中。我的意思是说要么它们应该保存和更新,要么不应该对数据库执行任何操作。

我尝试过使用猫鼬会话和交易,但遇到此错误。

 MongoError: This MongoDB deployment does not support retryable writes. Please add retryWrites=false to your connection string.

在这种情况下,有什么办法可以解决?

1 个答案:

答案 0 :(得分:0)

如果我正确理解您的问题,则可以在以下位置删除创建的文档:

.exec((error: any, auction: IAuction) => {
    if (error) {
       // here, by using .deleteOne()
      res.status(500).json({ message: "Could not post bid." });
    }

或者只是更改代码的结构,所以只有成功创建两个代码后,它们才会被保存并发送响应。