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?


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)

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: "abc@gmail.com",
                phoneNumber:"0123456789"
            }
        }, {
            multi: true
        },
        function(err, result) {
            console.log(result);
            console.log(err);
        })  

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);
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.