как сохранить документ и обновить другой, которые зависят друг от друга, с помощью mongoose - PullRequest
0 голосов
/ 05 февраля 2020

Вот моя модель ставок.

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'
    }
  ]
});

Когда пользователь делает ставку на любой аукцион Я сохраняю ставку в коллекции заявок и обновляю коллекцию аукционов, используя mon goose 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 });
    }
  });
};

По любой причине, если выбрасывает любой из этих двух (save bid и findOneAndUpdate) Любая ошибка, которую я хочу, чтобы ничего не было сохранено в базе данных. Я хочу сказать, что либо они должны сохранять и обновлять, либо ничего не следует делать с базой данных.

Я пытался использовать сеанс и транзакцию mon goose, но получил эту ошибку.

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

Есть Есть ли способ потренироваться в этом сценарии?

1 Ответ

0 голосов
/ 05 февраля 2020

Если я правильно понимаю вашу проблему, вы можете просто удалить созданный документ в:

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

Или просто изменить структуру вашего кода, так что только когда два успешно созданы, они будут сохранены и ответ будет быть отправленным.

...