Според Sammaye, не изглежда, че има "правилен" начин да направите това. Моето решение беше да създам последователност, както е описано на сайта mongo и просто добавя поле 'seq' към всеки запис в моята колекция. Сега имам уникално поле, което може надеждно да се сортира за актуализиране.
Надеждното сортиране е важно тук. Щях просто да сортирам по автоматично генерирания _id, но бързо разбрах, че естественият ред НЕ е същият като възходящ ред за ObjectId (от тази страница изглежда, че стойността на низа има предимство пред стойността на обекта, което съответства на поведението, което наблюдавах при тестване). Освен това е напълно възможно записът да бъде преместен на диск, което прави естествения ред ненадежден за сортиране.
Така че сега мога да направя заявка за запис с най-малкия 'seq', който вече НЕ е актуализиран, за да получа включваща начална точка. След това правя заявка за записи с 'seq', по-голям от моята начална точка, и пропускам (важно е да пропусна, тъй като 'seq' може да е рядко, ако премахнете документи и т.н...) броя на записите, които искам да актуализирам. Поставете ограничение от 1 на тази заявка и ще получите невключваща крайна точка. Сега мога да издам актуализация със заявка за 'updated' =0, 'seq'>=моята начална точка и <моята крайна точка. Ако приемем, че никоя друга тема не ме е победила, актуализацията трябва да ми даде това, което искам.
Ето отново стъпките:
- създайте последователност с автоматично нарастване с помощта на findAndModify
- добавете поле към вашата колекция, което използва последователността за автоматично нарастване
- заявка за намиране на подходяща начална точка:db.xx.find({ updated:0 }).sort({ seq:1 }).limit(1)
- заявка за намиране на подходяща крайна точка:db.xx.find({ seq:{ $gt:startSeq }}).sort({ seq:1 }).skip(updateCount).limit(1)
- актуализирайте колекцията, като използвате началната и крайната точка:db.xx.update({ updated:0, seq:{ $gte:startSeq }, seq:{ $lt:endSeq }, $isolated:1}, { updated :1 },{ multi:true })
Доста болезнено, но върши работата.