Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

MongoDB: Problems using $concat to update the value of a field

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?

like image 770
Aliena Avatar asked Jan 16 '17 11:01

Aliena


People also ask

Is it possible to update MongoDB field using value of another field?

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.

How do I change the value of a field in MongoDB?

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.

Which operator is used to update specific fields in MongoDB?

Use Update Operator Expressions ( $inc and $set ) The db.collection.update() method updates only the corresponding fields in the document.

How do I concatenate strings in MongoDB?

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.


2 Answers

$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 } }
    )
   });
like image 123
DonDaniel Avatar answered Nov 15 '22 08:11

DonDaniel


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);
like image 36
Ratan Uday Kumar Avatar answered Nov 15 '22 07:11

Ratan Uday Kumar