MongoDB: Aktualisieren Sie jedes Dokument in einem Feld

214

Ich habe eine Sammlung foohypothetisch benannt.

Jede Instanz von foohat ein Feld namens lastLookedAt, das seit der Epoche ein UNIX-Zeitstempel ist. Ich möchte in der Lage sein, den MongoDB-Client zu durchsuchen und diesen Zeitstempel für alle vorhandenen Dokumente (etwa 20.000 davon) auf den aktuellen Zeitstempel zu setzen.

Wie gehe ich am besten damit um?

Randombits
quelle
Mögliches Duplikat von MongoDB: Wie aktualisiere ich mehrere Dokumente mit einem einzigen Befehl?
Ciro Santilli 法轮功 冠状 病 六四 事件 7

Antworten:

458

Unabhängig von der Version <update>lautet das Beispiel für Ihr Beispiel :

{  $set: { lastLookedAt: Date.now() / 1000 }  }

Abhängig von Ihrer Version von MongoDB sieht die Abfrage jedoch anders aus. Unabhängig von der Version ist der Schlüssel, dass die leere Bedingung {}mit jedem Dokument übereinstimmt . In der Mongo-Shell oder mit einem beliebigen MongoDB-Client:

$ version> = 3.2 :

db.foo.updateMany( {}, <update> )
  • {} ist die Bedingung (die leere Bedingung entspricht jedem Dokument)

3.2> $ version> = 2.2 :

db.foo.update( {}, <update>, { multi: true } )
  • {} ist die Bedingung (die leere Bedingung entspricht jedem Dokument)
  • {multi: true} ist die Option "Mehrere Dokumente aktualisieren"

$ version <2.2 :

db.foo.update( {}, <update>, false, true )
  • {} ist die Bedingung (die leere Bedingung entspricht jedem Dokument)
  • falsesteht für den Parameter " upsert "
  • true ist für den Parameter "multi" (mehrere Datensätze aktualisieren)
Philippe Plantier
quelle
Date.now () gibt auch einen Zeitstempel zurück. Siehe developer.mozilla.org/en/JavaScript/Reference/Global_Objects/…
Philippe Plantier
Es gibt mir immer noch ein Datum, das für all diese Fälle von Foo nicht annähernd richtig ist. Nach dem Ausführen mache ich ein db.foo.findOne () und lastLookedAt ist: 1327691719186, was übersetzt jruby-1.6.5: 011> Time.at (1327691719186) => Sun Nov 16 02:19:46 -0500 44042
Randombits
1
Meine schlechte POSIX-Zeit verwendet Sekunden, während die Javascript-Zeit Millisekunden verwendet. Date.now () / 1000 sollte jedoch funktionieren. Möglicherweise müssen Sie es abrunden.
Philippe Plantier
psh es ist das leere {}, das es für mich getan hat, danke Phil
Jona
1
Wie man es für oldvalue + "some string" macht
Mahesh K
11

Dieser Code ist hilfreich für Sie

        Model.update({
            'type': "newuser"
        }, {
            $set: {
                email: "[email protected]",
                phoneNumber:"0123456789"
            }
        }, {
            multi: true
        },
        function(err, result) {
            console.log(result);
            console.log(err);
        })  
Jitendra
quelle
4

Ich benutze den MongoDB .NET-Treiber seit etwas mehr als einem Monat. Wenn ich dies mit dem .NET-Treiber tun würde, würde ich die Update-Methode für das Auflistungsobjekt verwenden. Zuerst erstelle ich eine Abfrage, die mir alle Dokumente liefert, an denen ich interessiert bin, und aktualisiere die Felder, die ich ändern möchte. Das Aktualisieren in Mongo wirkt sich nur auf das erste Dokument aus. Um alle Dokumente zu aktualisieren, die sich aus der Abfrage ergeben, muss das Aktualisierungsflag "Multi" verwendet werden. Beispielcode folgt ...

var collection = db.GetCollection("Foo");
var query = Query.GTE("No", 1); // need to construct in such a way that it will give all 20K //docs.
var update = Update.Set("timestamp", datetime.UtcNow);
collection.Update(query, update, UpdateFlags.Multi);
user1163459
quelle