javascript - 如何添加猫鼬事务并创建文档?
问题描述
我想在 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
)
解决方案
回答 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));