Как прекратить работу курсора mongodb - PullRequest
0 голосов
/ 24 января 2019

Я пытаюсь прервать запрос после того, как он сработает в определенное время.Поэтому я использую метод mongodb maxTimeMS () для моего запроса.Но это не работает.

Я за исключением того, что этот запрос остановится через 5 секунд, но продолжит работать.как прекратить мой запрос после того, как он работает в определенное время

var sum = 0 ;
var inbox=db.getMongo().getDB("xxxx").getCollection("Inbox");
var oldInbox=db.getMongo().getDB("xxxx").getCollection("oldInbox");
var inboxCount = inbox.count();
var oldCount = oldInbox.count();
var dif = inboxCount - oldCount ;
if ( dif > 10000000 ){
var cursor = inbox.find().maxTimeMS(5000);
cursor.sort({_id : -1}).forEach(function(uidDoc) {
    var uid = uidDoc.uid;
    var docsToMigrate = [];
    var idsToRemove = [];
    inbox.find({uid : uid}).sort({_id : -1}).skip(10).forEach(function(doc) {
        docsToMigrate.push(doc);
        idsToRemove.push(doc._id);
        var x = doc._id;
    });
    oldInbox.insert(docsToMigrate);
    inbox.remove({_id : {$in : idsToRemove}});
    sum = sum + idsToRemove.length;
    if ( x = 0 )
    {
        print(sum);
        cursor.close();
    }
});
};

1 Ответ

0 голосов
/ 24 января 2019

На основании документации здесь , maxTimeMS - ограничение времени обработки в базе данных. Это будет охватывать планирование запросов, выполнение и сериализацию данных, но таймер останавливается, когда курсор находится в режиме ожидания. Это не настенное время и означает, что оно не учитывает время выполнения вашего обратного вызова forEach. Поскольку ваш запрос кажется довольно простым, для его остановки может потребоваться гораздо больше времени, чем предел maxTimeMS.

Таким образом, чтобы ответить на ваш вопрос, вам нужно будет сохранить таймер в другом месте и управлять им самостоятельно, используя разбитые на страницы запросы .

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