MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Mongodb aktualizuje ograniczoną liczbę dokumentów

Według Sammaye'a nie wygląda na to, że istnieje „właściwy” sposób, aby to zrobić.Moim rozwiązaniem było utworzenie sekwencja zgodnie z opisem na stronie mongo i po prostu dodaj pole 'seq' do każdego rekordu w mojej kolekcji. Teraz mam unikalne pole, które można niezawodnie sortować do aktualizacji.

Niezawodne sortowanie jest tutaj ważne. Miałem zamiar posortować według automatycznie wygenerowanego identyfikatora _id, ale szybko zdałem sobie sprawę, że kolejność naturalna NIE jest tym samym, co kolejność rosnąca dla identyfikatorów ObjectId (od ta strona wygląda na to, że wartość ciągu ma pierwszeństwo przed wartością obiektu, która pasuje do zachowania, które zaobserwowałem podczas testowania). Ponadto całkowicie możliwe jest przeniesienie rekordu na dysk, co sprawia, że ​​naturalna kolejność sortowania jest niepewna.

Więc teraz mogę zapytać o rekord z najmniejszą sekwencją, która NIE została jeszcze zaktualizowana, aby uzyskać włącznie punkt początkowy. Następnie wyszukuję rekordy z 'seq' większym niż mój punkt początkowy i pomijam (ważne jest, aby pominąć, ponieważ 'seq' może być rzadkie, jeśli usuniesz dokumenty itp.) liczbę rekordów, które chcę zaktualizować. Ustaw limit na 1 w tym zapytaniu, a otrzymasz nieuwzględniający punkt końcowy. Teraz mogę wydać aktualizację z zapytaniem „zaktualizowany” =0, „seq”>=mój punkt początkowy i

Oto kolejne kroki:

  1. utwórz sekwencję automatycznego przyrostu za pomocą findAndModify
  2. dodaj pole do swojej kolekcji, które używa sekwencji automatycznego zwiększania
  3. zapytanie, aby znaleźć odpowiedni punkt początkowy:db.xx.find({ updated:0 }).sort({ seq:1 }).limit(1)
  4. zapytanie w celu znalezienia odpowiedniego punktu końcowego:db.xx.find({ seq:{ $gt:startSeq }}).sort({ seq:1 }).skip(updateCount).limit(1)
  5. zaktualizuj kolekcję, używając punktów początkowych i końcowych:db.xx.update({ updated:0, seq:{ $gte:startSeq }, seq:{ $lt:endSeq }, $isolated:1}, { updated :1 }, { multi:prawda })

Dość bolesne, ale to załatwia sprawę.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Znajdź ciąg w ciągu w SQL

  2. Draft.js — nie można pobrać danych z bazy danych. Błąd cross-origin

  3. wywołanie funkcji azure (node) mongodb kończy się bez błędu, ale nic nie wraca z zapytania

  4. Czy MongoDB MapReduce blokuje bazę danych?

  5. Nie mogę połączyć się ze zdalnym serwerem mongodb z django/djongo