Pergunta

Fiquei surpreso ao descobrir que o código de exemplo a seguir apenas atualiza um único documento:

> db.test.save({"_id":1, "foo":"bar"});
> db.test.save({"_id":2, "foo":"bar"});

> db.test.update({"foo":"bar"}, {"$set":{"test":"success!"}});

> db.test.find({"test":"success!"}).count();
1

Eu sei que posso fazer um loop e continuar atualizando até que todas elas mudem, mas isso parece terrivelmente ineficiente. Existe uma maneira melhor?

Foi útil?

Solução

A atualização múltipla foi adicionada recentemente, por isso está disponível apenas nos lançamentos de desenvolvimento (1.1.3). A partir da concha, você faz uma atualização múltipla passando true Como o quarto argumento para update(), onde o terceiro argumento é o argumento de UpSert:

db.test.update({foo: "bar"}, {$set: {test: "success!"}}, false, true);

Para versões do MongoDB 2.2+, você precisa definir a opção Multi True para atualizar vários documentos de uma só vez.

db.test.update({foo: "bar"}, {$set: {test: "success!"}}, {multi: true})

Para versões do MongoDB 3.2+, você também pode usar o novo método updateMany() para atualizar vários documentos de uma só vez, sem a necessidade de separado multi opção.

db.test.updateMany({foo: "bar"}, {$set: {test: "success!"}})

Outras dicas

Atualização a partir da v2.2, a função de atualização assume o seguinte formulário:

 db.collection.update(
   <query>,
   <update>,
   { upsert: <boolean>, multi: <boolean> }
)

A resposta selecionada não se aplica mais.

https://docs.mongodb.com/manual/reference/method/db.collection.update/

Por Versão Mongo> 2.2, adicione um campo multi e defina -o como true

db.Collection.update({query}, 
                 {$set: {field1: "f1", field2: "f2"}},
                 {multi: true })

Eu criei uma maneira de fazer isso com uma interface melhor.

  • db.collection.find({ ... }).update({ ... }) - Atualização multi
  • db.collection.find({ ... }).replace({ ... }) - Substituição única
  • db.collection.find({ ... }).upsert({ ... }) - Upsert único
  • db.collection.find({ ... }).remove() - Multi Remover

Você também pode aplicar limite, pular, classificar para as atualizações e remover, encadeando -os antes.

Se você estiver interessado, confira Mongo-Hacker

No cliente MongoDB, tipo:

db.Collection.updateMany({}, $set: {field1: 'field1', field2: 'field2'})

Novo na versão 3.2

Params ::

{}:  select all records updated

Argumento da palavra -chave multi Não pego

O MongoDB encontrará apenas um documento correspondente que corresponde aos critérios de consulta quando você estiver emitindo um comando de atualização, o que o documento corresponde primeiro será atualizado, mesmo que haja mais documentos que correspondam aos critérios que serão ignorados.

Portanto, para superar isso, podemos especificar a opção "Multi" na sua declaração de atualização, significando atualizar todos os documentos que correspondem aos critérios de consulta. Digitalize para todos os documentos da coleção, encontrando aqueles que correspondem aos critérios e atualizam:

db.test.update({"foo":"bar"},{"$set":{"test":"success!"}}, {multi:true} )

Eu tive o mesmo problema e encontrei a solução, e funciona como um charme

Basta definir a bandeira multi como true como esta:

 db.Collection.update(
                {_id_receiver: id_receiver},
               {$set: {is_showed: true}},
                {multi: true}   /* --> multiple update */
            , function (err, updated) {...});

Espero que ajude :)

Você pode usar

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

Todas as versões mais recentes do MongoDB Updatemany () está funcionando bem

db.getCollection('workers').updateMany({},{$set: {"assignedVehicleId" : "45680"}});

Obrigado por compartilhar isso, usei com 2.6.7 e a consulta seguindo acabou de trabalhar,

Para todos os documentos:

db.screen.update({stat:"PRO"} , {$set : {stat:"pro"}}, {multi:true})

para um único doc.

db.screen.update({stat:"PRO"} , {$set : {stat:"pro"}}, {multi:false})
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top