我尝试避免在循环浏览文档时发生写操作时mongodb游标返回的重复项。
以下代码将循环播放,因为我们在阅读集合时修改了updatedAt日期。
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()
并且效果很好,但不能在排序查询中使用。
我找到的唯一选择是首先发送计数请求,然后对游标应用限制而不使用快照。这似乎工作,因为mongo似乎堆叠了修改过的文档FIFO样式。 问题是可以在count和cursor查询之间插入文档,这会导致游标返回不完整的数据。
如何使用排序查询循环游标,而不必使用重复文档?