Я запускаю набор репликации 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);
});