循环遍历排序的mongodb游标时如何避免重复

时间:2018-04-30 14:56:05

标签: mongodb mongoose

我尝试避免在循环浏览文档时发生写操作时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查询之间插入文档,这会导致游标返回不完整的数据。

如何使用排序查询循环游标,而不必使用重复文档?

0 个答案:

没有答案