MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Mongodb aktualisiert eine begrenzte Anzahl von Dokumenten

Laut Sammaye sieht es nicht so aus, als gäbe es einen "richtigen" Weg, dies zu tun. Meine Problemumgehung bestand darin, einen sequence wie auf der Mongo-Site beschrieben und fügen Sie einfach jedem Datensatz in meiner Sammlung ein 'seq'-Feld hinzu. Jetzt habe ich ein eindeutiges Feld, das zuverlässig sortierbar ist, um aktualisiert zu werden.

Zuverlässig sortierbar ist hier wichtig. Ich wollte gerade nach der automatisch generierten _id sortieren, aber mir wurde schnell klar, dass die natürliche Reihenfolge NICHT dasselbe ist wie die aufsteigende Reihenfolge für ObjectIds (von diese Seite es sieht so aus, als hätte der Zeichenfolgenwert Vorrang vor dem Objektwert, der dem Verhalten entspricht, das ich beim Testen beobachtet habe). Außerdem ist es durchaus möglich, dass ein Datensatz auf der Festplatte verschoben wird, wodurch die natürliche Reihenfolge für das Sortieren unzuverlässig wird.

Jetzt kann ich also nach dem Datensatz mit dem kleinsten 'seq' fragen, der noch NICHT aktualisiert wurde, um einen inklusiven Startpunkt zu erhalten. Als nächstes frage ich nach Datensätzen mit 'seq' größer als mein Startpunkt und überspringe die Anzahl der Datensätze, die ich aktualisieren möchte (es ist wichtig zu überspringen, da 'seq' spärlich sein kann, wenn Sie Dokumente entfernen usw.). Legen Sie für diese Abfrage ein Limit von 1 fest, und Sie haben einen nicht inklusiven Endpunkt. Jetzt kann ich ein Update mit einer Abfrage von 'updated' =0, 'seq'>=mein Startpunkt und

Hier sind die Schritte noch einmal:

  1. erstellen Sie eine Auto-Increment-Sequenz mit findAndModify
  2. fügen Sie Ihrer Sammlung ein Feld hinzu, das die Auto-Increment-Sequenz verwendet
  3. Abfrage, um einen geeigneten Startpunkt zu finden:db.xx.find({ updated:0 }).sort({ seq:1 }).limit(1)
  4. Abfrage, um einen geeigneten Endpunkt zu finden:db.xx.find({ seq:{ $gt:startSeq }}).sort({ seq:1 }).skip(updateCount).limit(1)
  5. Aktualisiere die Sammlung mit den Start- und Endpunkten:db.xx.update({ updated:0, seq:{ $gte:startSeq }, seq:{ $lt:endSeq }, $isolated:1}, { updated :1 },{ multi:true })

Ziemlich schmerzhaft, aber es erledigt die Arbeit.