Сбой агрегата MongoDB с ошибкой afterClusterTime - PullRequest
0 голосов
/ 05 декабря 2018

Я запускаю набор репликации MongoDB 4.0 и обращаюсь к нему из NodeJ, но столкнулся с проблемой при использовании агрегации.

Когда число результатов, возвращаемых агрегатом, превышает значение по умолчанию или указанное batchSize, я получаю следующееошибка:

MongoError: afterClusterTime is not allowed for this command
at ...\mongodb-core\lib\connection\pool.js:581:63
at authenticateStragglers (...\mongodb-core\lib\connection\pool.js:504:16)
at Connection.messageHandler (...\mongodb-core\lib\connection\pool.js:540:5)
at emitMessageHandler (...\mongodb-core\lib\connection\connection.js:310:10)
at Socket.<anonymous> (...\mongodb-core\lib\connection\connection.js:453:17)
at emitOne (events.js:96:13)
at Socket.emit (events.js:188:7)
at readableAddChunk (_stream_readable.js:176:18)
at Socket.Readable.push (_stream_readable.js:134:10)
at TCP.onread (net.js:559:20)

Я сузил проблему до использования сессий, это проблема с MongoDB или драйвером NodeJS, или я что-то упустил, как это сделать.

Для справки, для выявления проблемы достаточно:

Набор репликации MongoDB 4.0, созданный с помощью Zero-config MongoDB runner (run-rs --version = 4.0.0)

NodeJs

package.json

 {
  "name": "aggregate_test",
  "dependencies": {
    "mongodb": "^3.1.4",
    "yargs": "^12.0.5"
  }
}

index.js

#!/usr/bin/env node
var args = require('yargs').argv;
var MongoClient = require('mongodb').MongoClient;

MongoClient.connect('mongodb://localhost:27017,localhost:27018,localhost:27019?replicaSet=rs', {useNewUrlParser: true})
    .then(function (client) {
        var session = args.session !== false ? client.startSession() : undefined;
        var db = client.db('test');
        var collection = db.collection('test_collection');
        return collection.insertMany([
                    {item: 'one'},
                    {item: 'two'},
                    {item: 'three'}
                ], {session: session})
            .then(function () {
                return collection.aggregate(
                    [{$match: {item: {$exists: true}}}],
                    {session: session, cursor: {batchSize: 1}});
            })
            .then(function (cursor) {
                /* Error occurs as result of this call */
                return cursor.toArray();
            });
    })
    .then(function (result) {
        console.log(result);
        process.exit(0);
    })
    .catch(function (err) {
        console.error(err);
        process.exit(1);
    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...