web-dev-qa-db-fra.com

MongoDB: met à jour chaque document sur un champ

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

Chaque instance de foo possède un champ appelé lastLookedAt, qui est un horodatage UNIX depuis Epoch. J'aimerais pouvoir consulter le client MongoDB et définir l'horodatage de tous les documents existants (environ 20 000) sur l'horodatage actuel.

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

190
randombits

Dans le shell Mongo ou avec n’importe quel client Mongodb:

• Pour Mongodb> = 3.2:

db.foo.updateMany({}, {$set: {lastLookedAt: Date.now() / 1000}})

Voir http://docs.mongodb.org/manual/tutorial/modify-documents/#update-multiple-documents

  • {} est la condition (la condition vide correspond à n'importe quel document)
  • {$set: {lastLookedAt: Date.now() / 1000}} est ce que vous voulez faire

• Pour Mongodb> = 2.2:

db.foo.update({}, {$set: {lastLookedAt: Date.now() / 1000}}, { multi: true })

Voir http://docs.mongodb.org/manual/tutorial/modify-documents/#update-multiple-documents

  • {} est la condition (la condition vide correspond à n'importe quel document)
  • {$set: {lastLookedAt: Date.now() / 1000}} est ce que vous voulez faire
  • {multi: true} est l'option "mettre à jour plusieurs documents"

• Pour Mongodb <2.2:

db.foo.update({}, {$set: {lastLookedAt: Date.now() / 1000}}, false, true)

Voir https://web.archive.org/web/20120613233453/http://www.mongodb.org/display/DOCS/Updating

  • {} est la condition (la condition vide correspond à n'importe quel document)
  • {$set: {lastLookedAt: Date.now() / 1000}} est ce que vous voulez faire
  • false est pour le paramètre "upsert" (insérer si non présent, ou sinon mettre à jour - pas ce que vous voulez)
  • true est pour le paramètre "multi" (mettre à jour plusieurs enregistrements)
410
Philippe Plantier

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

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 collection. Tout d'abord, je vais construire une requête qui me fournira tous les documents qui m'intéressent et faire une mise à jour des champs que je souhaite modifier. La mise à jour dans Mongo affecte uniquement le premier document et pour mettre à jour tous les documents résultant de la requête, il est nécessaire d'utiliser l'indicateur de mise à jour 'Multi'. 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);
4
user1163459