I'm trying to update the value of a field in a MongoDB collection by concatenating it with a literal string. Besides this, the field is an integer, and I want to add a "0" in front, so it will became a string.
I've read that I can't use the old value of the field in a single update instruction, so I'm using a forEach() method.
Here is the code:
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]}}}
)
});
The return result is :
The dollar ($) prefixed field '$concat' in 'field_1.$concat' is not valid for storage.
I'm sure I'm not writting the $concat command properly, is there any way to do this?
Starting from MongoDB 4.2 you can perform Updates with an Aggregation Pipeline. An aggregation pipeline enables more expressive updates including calculated fields and references to other field values in the same document.
We can use $set and $inc operators to update any field in MongoDB. The $set operator will set the newly specified value while the $inc operator will increase the value by a specified value.
Use Update Operator Expressions ( $inc and $set ) The db.collection.update() method updates only the corresponding fields in the document.
Concatenates strings and returns the concatenated string. $concat has the following syntax: { $concat: [ <expression1>, <expression2>, ... ] } The arguments can be any valid expression as long as they resolve to strings.
$concat is an aggregation pipeline, not an update operator/modifier.
It seems that what you're trying to do can be achieved by doing the following:
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 } }
)
});
To update the MongoDB field using the value of another field for MongoDB version 4.2 also introduced the $set pipeline stage operator which is an alias for $addFields. You can use $set here as it maps with what we are trying to achieve.
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);
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With