MongoDB: mettez à jour chaque document sur un champ

214

J'ai une collection nommée foohypothétiquement.

Chaque instance de foopossède un champ appelé lastLookedAt qui est un horodatage UNIX depuis l'époque. Je voudrais pouvoir passer par le client MongoDB et définir cet horodatage pour tous les documents existants (environ 20 000 d'entre eux) sur l'horodatage actuel.

Quelle est la meilleure façon de gérer cela?

randombits
la source
Copie possible de MongoDB: Comment mettre à jour plusieurs documents avec une seule commande?
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Réponses:

458

Quelle que soit la version, pour votre exemple, le <update>est:

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

Cependant, selon votre version de MongoDB, la requête sera différente. Quelle que soit la version, la clé est que la condition vide {}correspondra à n'importe quel document . Dans le shell Mongo, ou avec n'importe quel client MongoDB:

$ version> = 3.2 :

db.foo.updateMany( {}, <update> )
  • {} est la condition (la condition vide correspond à n'importe quel document)

3.2> $ version> = 2.2 :

db.foo.update( {}, <update>, { multi: true } )
  • {} est la condition (la condition vide correspond à n'importe quel document)
  • {multi: true} est l'option "mettre à jour plusieurs documents"

$ version <2.2 :

db.foo.update( {}, <update>, false, true )
  • {} est la condition (la condition vide correspond à n'importe quel document)
  • falseest pour le paramètre " upsert "
  • true est pour le paramètre "multi" (mettre à jour plusieurs enregistrements)
Philippe Plantier
la source
Date.now () renvoie également un horodatage. Voir developer.mozilla.org/en/JavaScript/Reference/Global_Objects/…
Philippe Plantier
Cela me donne toujours une date qui est loin d'être juste pour toutes ces instances de foo. Après avoir exécuté cela, je fais un db.foo.findOne () et lastLookedAt est: 1327691719186, ce qui se traduit par jruby-1.6.5: 011> Time.at (1327691719186) => dim 16 nov 02:19:46 -0500 44042
randombits
1
Mon mauvais, le temps POSIX utilise des secondes, tandis que le temps Javascript utilise des millisecondes. Date.now () / 1000 devrait cependant fonctionner. Vous devrez peut-être l'arrondir.
Philippe Plantier
psh c'est ce vide {} qui l'a fait pour moi, merci Phil
Jona
1
Comment le faire pour oldvalue + "some string"
Mahesh K
11

Ce code vous sera utile

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

J'utilise le pilote MongoDB .NET depuis un peu plus d'un mois maintenant. Si je devais le faire en utilisant le pilote .NET, j'utiliserais la méthode Update sur l'objet de collection. Tout d'abord, je vais construire une requête qui me donnera tous les documents qui m'intéressent et faire une mise à jour sur les champs que je souhaite modifier. La mise à jour dans Mongo n'affecte que le premier document et pour mettre à jour tous les documents résultant de la requête, il faut utiliser l'indicateur de mise à jour «Multi». Un exemple de code suit ...

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
la source