MongoDB: atualize todos os documentos em um campo

214

Eu tenho um colecionado nomeado foohipoteticamente.

Cada instância de foopossui um campo chamado lastLookedAt, que é um registro de data e hora do UNIX desde a época. Eu gostaria de poder percorrer o cliente MongoDB e definir esse carimbo de data / hora para todos os documentos existentes (cerca de 20.000 deles) como o carimbo de data / hora atual.

Qual é a melhor maneira de lidar com isso?

randombits
fonte
Possível duplicata do MongoDB: Como atualizar vários documentos com um único comando?
Ciro Santilli escreveu

Respostas:

458

Independentemente da versão, por exemplo, o <update>é:

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

No entanto, dependendo da sua versão do MongoDB, a consulta terá uma aparência diferente. Independentemente da versão, a chave é que a condição vazia {}corresponderá a qualquer documento . No shell do Mongo ou com qualquer cliente do MongoDB:

$ version> = 3.2 :

db.foo.updateMany( {}, <update> )
  • {} é a condição (a condição vazia corresponde a qualquer documento)

3.2> $ version> = 2.2 :

db.foo.update( {}, <update>, { multi: true } )
  • {} é a condição (a condição vazia corresponde a qualquer documento)
  • {multi: true} é a opção "atualizar vários documentos"

$ versão <2.2 :

db.foo.update( {}, <update>, false, true )
  • {} é a condição (a condição vazia corresponde a qualquer documento)
  • falseé para o parâmetro " upsert "
  • true é para o parâmetro "multi" (atualizar vários registros)
Philippe Plantier
fonte
Date.now () também retorna um carimbo de data / hora. Veja developer.mozilla.org/en/JavaScript/Reference/Global_Objects/…
Philippe Plantier
Ainda está me dando uma data que não é nem de longe certa para todas essas instâncias de foo. Após a execução, eu faço um db.foo.findOne () e lastLookedAt é: 1327691719186, que se traduz em jruby-1.6.5: 011> Time.at (1327691719186) => dom 16 de novembro 02:19:46 -0500 44042
randombits
1
Meu mau tempo POSIX usa segundos, enquanto o tempo Javascript usa milissegundos. Date.now () / 1000 deve funcionar, no entanto. Você pode ter que arredondá-lo.
Philippe Plantier
PSH é que vazios {} que fez isso para mim, obrigado Phil
Jona
1
Como fazê-lo para OldValue + "alguma string"
Mahesh K
11

Este código será útil para você

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

Estou usando o driver MongoDB .NET há um pouco mais de um mês. Se eu fizesse isso usando o driver .NET, usaria o método Update no objeto de coleção. Primeiro, construirei uma consulta que fornecerá todos os documentos que me interessam e atualizarei os campos que desejo alterar. A atualização no Mongo afeta apenas o primeiro documento e para atualizar todos os documentos resultantes da consulta, é necessário usar o sinalizador de atualização 'Multi'. O código de exemplo segue ...

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
fonte