MongoDB: actualice cada documento en un campo

214

Tengo un nombre recogido foohipotéticamente.

Cada instancia de footiene un campo llamado lastLookedAt, que es una marca de tiempo UNIX desde época. Me gustaría poder pasar por el cliente MongoDB y establecer esa marca de tiempo para todos los documentos existentes (aproximadamente 20,000 de ellos) en la marca de tiempo actual.

¿Cuál es la mejor manera de manejar esto?

randombits
fuente
Posible duplicado de MongoDB: ¿Cómo actualizar varios documentos con un solo comando?
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Respuestas:

458

Independientemente de la versión, para su ejemplo, el <update>es:

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

Sin embargo, dependiendo de su versión de MongoDB, la consulta se verá diferente. Independientemente de la versión, la clave es que la condición vacía {}coincidirá con cualquier documento . En el shell Mongo, o con cualquier cliente MongoDB:

$ versión> = 3.2 :

db.foo.updateMany( {}, <update> )
  • {} es la condición (la condición vacía coincide con cualquier documento)

3.2> $ versión> = 2.2 :

db.foo.update( {}, <update>, { multi: true } )
  • {} es la condición (la condición vacía coincide con cualquier documento)
  • {multi: true} es la opción "actualizar varios documentos"

$ versión <2.2 :

db.foo.update( {}, <update>, false, true )
  • {} es la condición (la condición vacía coincide con cualquier documento)
  • falsees para el parámetro " upsert "
  • true es para el parámetro "multi" (actualizar múltiples registros)
Philippe Plantier
fuente
Date.now () también devuelve una marca de tiempo. Ver developer.mozilla.org/en/JavaScript/Reference/Global_Objects/…
Philippe Plantier el
Todavía me está dando una fecha que no es la más adecuada para todas estas instancias de foo. Después de ejecutar eso, hago un db.foo.findOne () y lastLookedAt es: 1327691719186, que se traduce en jruby-1.6.5: 011> Time.at (1327691719186) => dom 16 de noviembre 02:19:46 -0500 44042
randombits
1
Lo malo es que el tiempo POSIX usa segundos, mientras que el tiempo Javascript usa milisegundos. Sin embargo, Date.now () / 1000 debería funcionar. Puede que tenga que redondearlo.
Philippe Plantier
psh es ese vacío {} que lo hizo por mí, gracias Phil
Jona
1
Cómo hacerlo para oldvalue + "some string"
Mahesh K
11

Este código te será útil

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

He estado usando el controlador MongoDB .NET por poco más de un mes. Si lo hiciera usando el controlador .NET, usaría el método Update en el objeto de colección. Primero, construiré una consulta que me proporcionará todos los documentos que me interesan y haré una Actualización en los campos que quiero cambiar. La actualización en Mongo solo afecta al primer documento y para actualizar todos los documentos resultantes de la consulta uno necesita usar el indicador de actualización 'Multi'. El código de muestra sigue ...

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