如何在排序的mongodb游标中循环时避免重复

如何在排序的mongodb游标中循环时避免重复,mongodb,mongoose,Mongodb,Mongoose,我尽量避免在循环遍历文档时发生写入操作时,mongodb游标返回重复项 当我们在读取集合时修改updatedAt日期时,下面的代码将永远循环 const mongoose = require('mongoose'); mongoose.Promise = require('bluebird'); const Model = mongoose.model( 'Cat', mongoose.Schema({ name: String }, { timestamps: true }

我尽量避免在循环遍历文档时发生写入操作时,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();
        });
    });
const mongoose=require('mongoose');
mongoose.Promise=require('bluebird');
const Model=mongoose.Model(
“猫”,
Schema({name:String},{timestamps:true}).index({updatedAt:1})
);
猫鼬
.connect('mongodb://localhost/test“,{useMongoClient:true})
.然后(()=>{
const docs=[];
对于(变量i=0;i<2000;i++){
docs.push({name:i});
}
返回模型.insertMany(文档)
})
.然后(()=>{
const c=Model.find({}).sort({updatedAt:1}).cursor();
返回c.eachAsync((doc)=>{
修改文件标记(“名称”);
控制台日志(文件名);
返回单据保存();
});
});
我尝试使用
cursor.snapshot()
,它运行良好,但无法用于排序查询

我发现的唯一替代方法是先发送计数请求,然后对游标应用限制,而不使用快照。这似乎起作用了,因为mongo似乎在堆积修改过的文档FIFO样式。 问题在于,可以在计数和游标查询之间插入文档,从而导致游标返回的数据不完整


如何使用已排序的查询在游标中循环而不产生重复的文档?

Model.updateMany({},{“$currentDate”:{“updatedAt”:true}})
无需返回每个文档即可进行更改。这是一种反模式,非常低效而且非常危险。另外,
eachAsync()
也没有做你认为应该做的事情。不是你如何迭代光标,而是你根本不需要。@NeilLunn这只是一个例子来说明这个问题。在现实生活中,我实际上不仅仅是碰撞updatedAt字段,而是处理导入的文档,根据该过程的结果更新文档并发出事件。这个过程必须一个文件一个文件地完成。你能详细说明一下
eachAsync()
正在做什么或添加一些链接吗?