如何在 NodeJs 中使用 Mongo Bulk 和多文档事务?
How to use Mongo Bulk together with multi-document transactions in NodeJs?
我想 运行 在 mongo 中进行批量操作,但同时 运行 它在多文档事务中。我正在使用 Meteor 运行ning MongoDb.
的 NodeJs 驱动程序
根据 MongoDB 文档 (https://docs.mongodb.com/manual/reference/method/Bulk/),应该可以组合 Bulk
和 multi-document transactions
。但是,我一直无法解决这个问题。
我的问题是如何将 session
对象传递给批量操作。对于非批量操作,我们只是将其作为选项对象 const options = {session: session}
传递。我尝试了多种方式来传递它,但似乎没有任何效果。
在Bulk
操作中应该如何使用session
对象?
下面是我要实现的目标的简单示例。
const getMongoClient = function() {
const { client } = MongoInternals.defaultRemoteCollectionDriver().mongo;
return client;
}
const session = client.startSession();
try {
session.startTransaction();
const bulk = someCollectionToBulkWrite.rawCollection().initializeOrderedBulkOp(); // Pass the session here?
const dataInsert = someCollection.insert(someObject, {session}).await().value;
const dataInsertOtherDocument = someOtherCollection.insert(someOtherObject, {session}).await().value;
bulk.find( { _id: someId } ).update( { $set: { testField: 3}}); //Or pass the session here?
bulk.find( { _id: someOtherId } ).update( { $set: { testField: 3}});
bulk.execute().await(); // Or pass the session here?
session.commitTransaction().await();
} finally {
session.endSession();
}
我检查了 NodeJS 的 MongoDB 驱动程序代码,更具体地说是 Bulk
API (https://github.com/mongodb/node-mongodb-native/blob/master/lib/bulk/common.js)
execute
方法的定义如下所示:
execute(_writeConcern, options, callback);
因此,会话应作为第二个参数传递给 execute
。在问题中提供的示例中,如下所示:
bulk.execute(null, {session}).await();
我想 运行 在 mongo 中进行批量操作,但同时 运行 它在多文档事务中。我正在使用 Meteor 运行ning MongoDb.
的 NodeJs 驱动程序根据 MongoDB 文档 (https://docs.mongodb.com/manual/reference/method/Bulk/),应该可以组合 Bulk
和 multi-document transactions
。但是,我一直无法解决这个问题。
我的问题是如何将 session
对象传递给批量操作。对于非批量操作,我们只是将其作为选项对象 const options = {session: session}
传递。我尝试了多种方式来传递它,但似乎没有任何效果。
在Bulk
操作中应该如何使用session
对象?
下面是我要实现的目标的简单示例。
const getMongoClient = function() {
const { client } = MongoInternals.defaultRemoteCollectionDriver().mongo;
return client;
}
const session = client.startSession();
try {
session.startTransaction();
const bulk = someCollectionToBulkWrite.rawCollection().initializeOrderedBulkOp(); // Pass the session here?
const dataInsert = someCollection.insert(someObject, {session}).await().value;
const dataInsertOtherDocument = someOtherCollection.insert(someOtherObject, {session}).await().value;
bulk.find( { _id: someId } ).update( { $set: { testField: 3}}); //Or pass the session here?
bulk.find( { _id: someOtherId } ).update( { $set: { testField: 3}});
bulk.execute().await(); // Or pass the session here?
session.commitTransaction().await();
} finally {
session.endSession();
}
我检查了 NodeJS 的 MongoDB 驱动程序代码,更具体地说是 Bulk
API (https://github.com/mongodb/node-mongodb-native/blob/master/lib/bulk/common.js)
execute
方法的定义如下所示:
execute(_writeConcern, options, callback);
因此,会话应作为第二个参数传递给 execute
。在问题中提供的示例中,如下所示:
bulk.execute(null, {session}).await();