3

Другое дело, что результат приложения mongoShell и node.js. В моей среде mongodb используется кластер осколков.Собственный драйвер mongodb node.js возвращает ошибку «не master» при запуске db.command ({aggregate: ...})

Результат mongoShell

mongos> db.runCommand({aggregate : "collection", pipeline : my_pipeline(), allowDiskUse : true}); 
{ 
    "result" : [ ], 
    "ok" : 1, 
    "$gleStats" : { 
     "lastOpTime" : Timestamp(1428399959, 408), 
     "electionId" : ObjectId("552363d7ddfce783509094e5") 
    } 
} 

Результат Node.js применения

var mongodb = require('mongodb'); 
var mongoClient = new mongodb.MongoClient(...); 
mongoClient.open(function (err, mongoClient) { 
    var db = mongoClient.db(...); 
    db.command({aggregate : "collection", pipeline : my_pipeline(),  allowDiskUse : true}, function (err) { 
     ... 
    }); 
}); 

--> 

MongoError: exception: failed to create temporary $out collection 'db.tmp.agg_out.12': { note: "from execCommand", ok: 0.0, errmsg: "not master" } 

Я хочу, чтобы выполнить рамочное агрегация запрос в Node.js приложения.

Как выполнить этот запрос в приложении?

+0

Я думаю, вам нужно установить режим «slave okay» в оболочке 'rs.slaveOk()'. Это позволяет оболочке mongo знать, что вы разрешаете чтение из вторичного, и вы можете запросить обычную информацию из вторичных. – chridam

+1

Причина этого в том, что у вас установлено allowdiskUse значение true, а конвейер агрегации работает на вторичном. Вы не можете писать второстепенным в MongoDB. Как выглядит код подключения? Как бит в конструкторе MongoClients – Sammaye

ответ

3

Я решил это самостоятельно, обновив драйвер node.js mongodb.

Я использовал драйвер mongodb, который является версией 1.4.29 в предыдущем тесте.

В версии 1.4.29 API версии 'db.command' не проверяет предпочтения чтения о ведомых устройствах.

Поэтому, когда я запускаю свое приложение, у меня возникла такая ошибка.

После обновления драйвера node.js mongodb до версии 2.0.27 (последний) и сохранения моего приложения в измененный API приложение работает очень хорошо.

Благодарим вас за предложения.