Я стараюсь избегать дублирования, возвращаемого курсором 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 и курсора, что приводит к неполным данным, возвращаемым курсором.
Как я могу перебрать курсор, используя отсортированный запрос, не заканчивая дубликатами документов?