首页 > 解决方案 > 如何添加猫鼬事务并创建文档?

问题描述

我想在 POST 方法中添加一个猫鼬事务。创建事务时,它应该创建一个名为 stock 的文档。谁能帮我弄清楚我应该在这里做什么?我有一个 node/express/mongoose 应用程序,其中包含以下内容:

GoodsRecivedNote控制器

router.post('/', async (req, res) => {
  const session = await mongoose.startSession()
  try {
    const _id = await getNextSequence('goodsReceivedNote')
    req.body.id = _id

    const goodsReceivedNote = new GoodsReceivedNote(req.body)
    const stocks = new Stock(req.body)

    await goodsReceivedNote.save()

    //use mongoose transaction

    //creates a loop(data get from the arry called cart in goodsrecivednote)
    for (const item of data) {
      //insert stock modal(orderNo, packingId, orderSize, poNumber)
      item.create({})
      //insert(data, {session})
    }

    await session.commitTransaction()
    res.sendStatus(200)
  } catch (error) {
    await session.abortTransaction()
    return res.sendStatus(500)
  } finally {
    session.endSession()
  }
})

GoodsRecivedNote模型

const goodsReceivedNoteSchema = new Schema(
  {
    id: Number,    
    poNumber: String,  
    orderedDate: String,
    supplier: String,    
    orderNo: String,  
    cart: [
      {             
        packingId: Number,
        actualSize: String,  
        orderSize: String,
        brandId: Number,
        artWork: String,
        receivedQty: Number,
        grnDate: String,       
      },
    ],      
  },     
)

module.exports = mongoose.model(
  'GoodsReceivedNote',
  goodsReceivedNoteSchema
)

库存型号

const stockSchema = new Schema(
  {
    id: Number,    
    poNumber: Number,  
    orderNo: String,
    packingId: Number,     
    orderSize: String,       
    receivedQty: Number,
    availableQty: Number, 
 
  },     
)

module.exports = mongoose.model(
  'Stock',
  stockSchema
)

标签: javascriptnode.jsmongoosetransactions

解决方案


回答 210 亿可以完成工作,但 withTransaction() 比 startTransaction() 好得多。

我建议您改用 withTransaction。

    const session = await mongoose.startSession();
    await session.withTransaction(async (session) => {
     
    // For create..
    collection.create({something:"something"},{session:session});
    });

对于insertmany、updatemany,规则基本一样。。

collection.updateMany({find_something:"something"},{name:"Some name"},{session:session});

如果您想使用会话查找文档..

collection.findOne({_id: "some_id"}).session(session));

推荐阅读