258 votes

MongoDB : mise à jour de chaque document sur un seul champ

J'ai une collection nommée foo hypothétiquement.

Chaque instance de foo possède un champ appelé lastLookedAt qui est un timestamp UNIX depuis l'époque. J'aimerais pouvoir passer par le client MongoDB et définir cet horodatage pour tous les documents existants (environ 20 000) à l'horodatage actuel.

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

0 votes

527voto

Philippe Plantier Points 1421

Indépendamment de la version, pour votre exemple, l'élément <update> es:

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

Toutefois, en fonction de votre version de MongoDB, la requête aura une apparence différente. Quelle que soit la version, l'essentiel est que la condition de vide {} correspondra à tout 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)
  • false est pour le " upsert "Paramètres
  • true est pour le paramètre "multi" (mise à jour de plusieurs enregistrements)

0 votes

Date.now() renvoie également un horodatage. Voir developer.mozilla.org/fr/JavaScript/Référence/Global_Objects/

0 votes

Il me donne toujours une date qui est loin d'être correcte pour tous ces cas de foo. Après avoir exécuté cela, je fais un db.foo.findOne() et lastLookedAt est : 1327691719186, ce qui correspond à jruby-1.6.5 :011 > Time.at(1327691719186) => Sun Nov 16 02:19:46 -0500 44042

1 votes

Ma faute, le temps POSIX utilise les secondes, alors que le temps Javascript utilise les millisecondes. Date.now() / 1000 devrait fonctionner, cependant. Vous devrez peut-être l'arrondir.

12voto

Jitendra Points 169

Ce code vous sera utile

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

7voto

Harsh Patel Points 2163

Vous pouvez utiliser updateMany() méthodes de mongodb pour mettre à jour plusieurs documents

La requête simple est la suivante

db.collection.updateMany(filter, update, options)

Pour plus de documentation sur uppdateMany, lire aquí

Selon votre exigence l'actualisation code sera comme ça :

User.updateMany({"created": false}, {"$set":{"created": true}});

ici vous devez utiliser $set parce que vous voulez juste changer la création de vrai à faux. Par exemple. Si vous voulez modifier l'ensemble du document, vous n'avez pas besoin d'utiliser la fonction $set

5voto

user1163459 Points 68

J'utilise le pilote MongoDB .NET depuis un peu plus d'un mois maintenant. Si je devais le faire avec le pilote .NET, j'utiliserais la méthode Update sur l'objet collection. Tout d'abord, je vais construire une requête qui m'obtiendra tous les documents qui m'intéressent et effectuer une mise à jour des champs que je veux 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'. Voici un exemple de code...

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);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X