Как избежать дублирования при циклическом просмотре отсортированного курсора mongodb - PullRequest
0 голосов
/ 30 апреля 2018

Я стараюсь избегать дублирования, возвращаемого курсором mongodb, когда происходит операция записи во время циклического просмотра документов.

Следующий код зациклится навсегда, так как мы изменяем дату обновления при чтении коллекции.

const mongoose = require('mongoose');
mongoose.Promise = require('bluebird');

const Model = mongoose.model(
    'Cat', 
    mongoose.Schema({ name: String }, { timestamps: true }).index({ updatedAt: 1 })
);

mongoose
    .connect('mongodb://localhost/test', { useMongoClient: true })
    .then(() => {
        const docs = [];
        for (var i = 0; i < 2000; i++) {
            docs.push({ name: i });
        }
        return Model.insertMany(docs)
    })
    .then(() => {
        const c = Model.find({}).sort({ updatedAt: 1 }).cursor();

        return c.eachAsync((doc) => {
            doc.markModified('name');
            console.log(doc.name);
            return doc.save();
        });
    });

Я пытался использовать cursor.snapshot(), и он работает хорошо, но его нельзя использовать для отсортированного запроса.

Единственная найденная мною альтернатива - сначала отправить запрос на подсчет, а затем наложить курсор на курсор, не используя снимок вообще. Кажется, это работает, так как монго, кажется, складывает модифицированный стиль документа FIFO. Проблема в том, что документ может быть вставлен между запросами count и курсора, что приводит к неполным данным, возвращаемым курсором.

Как я могу перебрать курсор, используя отсортированный запрос, не заканчивая дубликатами документов?

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