MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Mongodb актуализира ограничен брой документи

Според Sammaye, не изглежда, че има "правилен" начин да направите това. Моето решение беше да създам последователност, както е описано на сайта mongo и просто добавя поле 'seq' към всеки запис в моята колекция. Сега имам уникално поле, което може надеждно да се сортира за актуализиране.

Надеждното сортиране е важно тук. Щях просто да сортирам по автоматично генерирания _id, но бързо разбрах, че естественият ред НЕ е същият като възходящ ред за ObjectId (от тази страница изглежда, че стойността на низа има предимство пред стойността на обекта, което съответства на поведението, което наблюдавах при тестване). Освен това е напълно възможно записът да бъде преместен на диск, което прави естествения ред ненадежден за сортиране.

Така че сега мога да направя заявка за запис с най-малкия 'seq', който вече НЕ е актуализиран, за да получа включваща начална точка. След това правя заявка за записи с 'seq', по-голям от моята начална точка, и пропускам (важно е да пропусна, тъй като 'seq' може да е рядко, ако премахнете документи и т.н...) броя на записите, които искам да актуализирам. Поставете ограничение от 1 на тази заявка и ще получите невключваща крайна точка. Сега мога да издам актуализация със заявка за 'updated' =0, 'seq'>=моята начална точка и <моята крайна точка. Ако приемем, че никоя друга тема не ме е победила, актуализацията трябва да ми даде това, което искам.

Ето отново стъпките:

  1. създайте последователност с автоматично нарастване с помощта на findAndModify
  2. добавете поле към вашата колекция, което използва последователността за автоматично нарастване
  3. заявка за намиране на подходяща начална точка:db.xx.find({ updated:0 }).sort({ seq:1 }).limit(1)
  4. заявка за намиране на подходяща крайна точка:db.xx.find({ seq:{ $gt:startSeq }}).sort({ seq:1 }).skip(updateCount).limit(1)
  5. актуализирайте колекцията, като използвате началната и крайната точка:db.xx.update({ updated:0, seq:{ $gte:startSeq }, seq:{ $lt:endSeq }, $isolated:1}, { updated :1 },{ multi:true })

Доста болезнено, но върши работата.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. В Morphia как мога да актуализирам един вграден обект в ArrayList

  2. Не може да се свърже с MongoDb (чрез удостоверяване) с помощта на mongocsharpdriver 2.7.0

  3. Намирането на родния драйвер от модела Mongoose не връща курсора

  4. MongoDB:Как да получите отделен списък със стойности на полета на поддокумента?

  5. Lumen - mongodb - jenssegers/laravel-mongodb - пощальон