Estoy tratando de actualizar el valor de un campo en una colección de MongoDB concatenándolo con una cadena literal. Además de esto, el campo es un número entero, y quiero agregar un "0" al frente, para que se convierta en una cadena.
He leído que no puedo usar el valor anterior del campo en una sola instrucción de actualización, así que estoy usando un método forEach() .
Aquí está el código:
db.col_1.find({"field_1": {$lt: 10000}}).forEach( function(i){ db.col_1.update({_id: i._id}, {$set: { "field_1": {$concat: ["0", i.field_1]}}} ) });
El resultado devuelto es:
The dollar ($) prefixed field '$concat' in 'field_1.$concat' is not valid for storage.
Estoy seguro de que no estoy escribiendo correctamente el comando $concat, ¿hay alguna forma de hacerlo?
$concat es una canalización de agregación, no un operador/modificador de actualización.
Parece que lo que estás tratando de hacer se puede lograr haciendo lo siguiente:
db.col_1 .find({ "field_1": { $lt: 10000 } }) .forEach( function(i) { db.col_1.update( { _id: i._id }, { $set: { "field_1": "0" + i.field_1 } } ) });
Para actualizar el campo MongoDB utilizando el valor de otro campo para MongoDB versión 4.2 , también se introdujo el operador de etapa de canalización $set, que es un alias para $addFields. Puede usar $set aquí, ya que se relaciona con lo que estamos tratando de lograr.
let query = { "field_1": { $lt: 10000 } }; let changes = { $set: { "field_1": { "$concat": ["0", "$field_1"] } } }; let UpdatedStatus = await col_1.updateMany(query, [changes]).lean(); console.log(UpdatedStatus);