Как использовать Mon go Bulk вместе с многодокументными транзакциями в NodeJs? - PullRequest
1 голос
/ 25 января 2020

Я хочу запустить массовую операцию в пн go, но в то же время запустить ее в многодокументной транзакции. Я использую Meteor под управлением NodeJs драйвера MongoDb.

В соответствии с документацией MongoDB (https://docs.mongodb.com/manual/reference/method/Bulk/) должно быть возможно объединить Bulk и multi-document transactions. Тем не менее, я не смог решить эту проблему.

Моя проблема в том, как передать объект session в групповые операции. Для не массовых операций мы просто передаем его как объект параметров const options = {session: session}. Я пытался передать его несколькими способами, но, похоже, ничего не работает.

Как использовать объект session в операциях Bulk?

Ниже приведен простой пример того, что я Я пытаюсь достичь.

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

1 Ответ

0 голосов
/ 26 января 2020

Я проверил код для драйвера MongoDB для NodeJS и более конкретно для 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();

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...