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

Решение за Bulk FindAndModify в MongoDB

Както споменахте, в момента няма чист начин да правите това, което искате. Най-добрият подход в момента за операции като тази, от която се нуждаете, е следният:

  1. Четецът избира X документа с подходящо ограничение и сортиране
  2. Четецът маркира документите, върнати от 1) със свой собствен уникален идентификатор на четец (e.g. update({_id:{$in:[<result set ids>]}, state:"available", $isolated:1}, {$set:{readerId:<your reader's ID>, state:"processing"}}, false, true) )
  3. Четецът избира всички документи, маркирани като обработващи се и със свой собствен идентификатор на четец. На този етап е гарантирано, че имате изключителен достъп до получения набор от документи.
  4. Предложете набора от резултати от 3) за вашата обработка.

Обърнете внимание, че това работи дори в много едновременни ситуации, тъй като четецът никога не може да резервира документи, които вече не са резервирани от друг четец (имайте предвид, че стъпка 2 може да резервира само налични в момента документи, а записите са атомарни). Бих добавил и времево клеймо с време на резервация, ако искате да можете да изчакате резервациите (например за сценарии, при които четците може да се сринат/откажат).

РЕДАКТИРАНЕ:Повече подробности:

Всички операции за запис могат понякога да се откажат за чакащи операции, ако записът отнема сравнително дълго време. Това означава, че стъпка 2) може да не види всички документи, маркирани от стъпка 1), освен ако не предприемете следните стъпки:

  • Използвайте подходяща стойност "w" (пишете загриженост), което означава 1 или по-висока. Това ще гарантира, че връзката, на която е извикана операцията за запис, ще изчака нейното завършване, независимо дали се е отказала.
  • Уверете се, че извършвате четенето в стъпка 2 на една и съща връзка (отнася се само за репликати с активирани четения на slaveOk) или нишка, така че да е гарантирано, че са последователни. Първото може да се направи в повечето драйвери с методите "requestStart" и "requestDone" или подобни (документация на Java тук ).
    • Добавете флага $isolated към вашите многократни актуализации, за да сте сигурни, че не може да се преплита с други операции за запис.

Вижте също коментари за дискусия относно атомарността/изолацията. Неправилно предположих, че множеството актуализации са изолирани. Не са, или поне не по подразбиране.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Може ли MongoDB да съхранява и манипулира низове от UTF-8 с кодови точки извън основната многоезична равнина?

  2. Динамични заявки в MongoDB и Node.js

  3. Как да експортирате сортирани данни с помощта на mongoexport?

  4. Поддръжка на обхват с течение на времето

  5. Не може да стартира услугата mongodb