MongoDB: aggiorna ogni documento su un campo


214

Ho un nome raccolto fooipoteticamente.

Ogni istanza di fooha un campo chiamato lastLookedAt che è un timestamp UNIX sin dall'epoca. Mi piacerebbe poter passare attraverso il client MongoDB e impostare quel timestamp per tutti i documenti esistenti (circa 20.000 di essi) sul timestamp corrente.

Qual è il modo migliore di gestirlo?


Risposte:


458

Indipendentemente dalla versione, per il tuo esempio, <update>è:

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

Tuttavia, a seconda della versione di MongoDB, la query avrà un aspetto diverso. Indipendentemente dalla versione, la chiave è che la condizione vuota {}corrisponderà a qualsiasi documento . Nella shell Mongo o con qualsiasi client MongoDB:

$ version> = 3.2 :

db.foo.updateMany( {}, <update> )
  • {} è la condizione (la condizione vuota corrisponde a qualsiasi documento)

3.2> $ versione> = 2.2 :

db.foo.update( {}, <update>, { multi: true } )
  • {} è la condizione (la condizione vuota corrisponde a qualsiasi documento)
  • {multi: true} è l'opzione "aggiorna più documenti"

$ versione <2.2 :

db.foo.update( {}, <update>, false, true )
  • {} è la condizione (la condizione vuota corrisponde a qualsiasi documento)
  • falseè per il parametro " upsert "
  • true è per il parametro "multi" (aggiorna più record)


Mi sta ancora dando un appuntamento che non è affatto giusto per tutti questi casi di pietà. Dopo aver eseguito quello che faccio un db.foo.findOne () e lastLookedAt è: 1327691719186, che si traduce in jruby-1.6.5: 011> Time.at (1327691719186) => Dom 16 Nov 02:19:46 -0500 44042
randombits

1
Il mio cattivo tempo POSIX usa secondi, mentre il tempo Javascript usa millisecondi. Tuttavia, Date.now () / 1000 dovrebbe funzionare. Potrebbe essere necessario arrotondarlo.
Philippe Plantier,

psh è quel vuoto {} che l'ha fatto per me, grazie Phil
Jona,

1
Come farlo per oldvalue + "some string"
Mahesh K,

11

Questo codice ti sarà utile

        Model.update({
            'type': "newuser"
        }, {
            $set: {
                email: "abc@gmail.com",
                phoneNumber:"0123456789"
            }
        }, {
            multi: true
        },
        function(err, result) {
            console.log(result);
            console.log(err);
        })  

4

Uso MongoDB .NET driver da poco più di un mese. Se dovessi farlo utilizzando il driver .NET, utilizzerei il metodo Update sull'oggetto collection. In primo luogo, costruirò una query che mi porterà tutti i documenti che mi interessano e farò un aggiornamento sui campi che voglio cambiare. L'aggiornamento in Mongo ha effetto solo sul primo documento e per aggiornare tutti i documenti risultanti dalla query è necessario utilizzare il flag di aggiornamento "Multi". Segue il codice di esempio ...

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);
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.