【问题标题】:How to add mongoose transaction and create a document?如何添加猫鼬事务并创建文档?
【发布时间】:2022-01-27 19:43:48
【问题描述】:

我想在 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
)

【问题讨论】:

    标签: javascript node.js mongoose transactions


    【解决方案1】:

    也许你可以试试这样的东西

    const session = await mongoose.startSession()
    session.startTransaction()
    const opts = { session }
    
    const stocks = await new Stock(req.body).save(opts)
    await goodsReceivedNote.save(opts)
    
    
    ...the rest of your code
    

    当您调用 Save Update 或 Delete 时,请添加 opts 作为选项

    【讨论】:

      【解决方案2】:

      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));
      

      【讨论】:

        猜你喜欢
        • 2016-10-06
        • 1970-01-01
        • 2020-05-14
        • 1970-01-01
        • 2016-06-08
        • 2019-02-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多