Search code examples
mongodbmongodb-updatemongodb-nodejs-driver

Isn't it possible to concat new value to a field in MongoDB document while updating it?


I have few documents in a MongoDB Collection and each has a unique field called "requestid".
Now I need to update a field "requeststatus" by concatenating a new value to an existing one in NodeJS application. I started using MongoDB for very recent and have less exposure in it's features.
After doing some research I got to know I could use "$set" with "$concat"


Updating with filter & options:

var filter = { requestid: data.requestid };
var updateDoc = { $set: { requeststatus: { $concat: ["$requeststatus","-",`. ${data.status}`] } } };
var options = { multi: true };
var jobDetails = { filter, updateDoc, options };


NodeJS code:

async function updateJobDetails(connection, data, mongoDetails){
const result = await connection.db(mongoDetails.mongoDatabase).collection(mongoDetails.collection).updateOne(data.filter, data.updateDoc, data.options);
}

This is not doing as expected, instead it's adding the new concatenated value as array of Object into MongoDB collection.


Existing document:

{
"_id": {
    "$oid": "6307120d3oiu895oi9e82eea5"
},
"requestid": "123456789",
"iscancelled": true,
"organizationid": "3",
"instanceid": "172",
"offerid": "offer123",
"promotionid": "promo123",
"jobtype": "portaljob123",
"jobid": "job123",
"requeststatus": "began"
}

Updated document:

{
"_id": {
    "$oid": "6307120d3oiu895oi9e82eea5"
},
"requestid": "123456789",
"iscancelled": true,
"organizationid": "3",
"instanceid": "172",
"offerid": "offer123",
"promotionid": "promo123",
"jobtype": "portaljob123",
"jobid": "job123",
"requeststatus": {
    "$concat": ["$requeststatus", "-", "tigger_datalink stopped since request was cancelled"]
}
}

Is there anything that I am doing wrong here? I even tried updateMany() but of no use. Run it as many times as desired it won't concat but keep updating same value as Object
Any help is appreciated here.


(Working) Updated NodeJS code:

async function updateJobDetails(connection, data, mongoDetails){
const result = await connection.db(mongoDetails.mongoDatabase).collection(mongoDetails.collection).updateOne(data.filter, [data.updateDoc], data.options);
}

Solution

  • In order to use an existing field's data you need to use an update with a pipeline. Try using your updateDoc inside a pipeline, like this:

    var filter = { requestid: data.requestid };
    var updateDoc = { $set: { requeststatus: { $concat: ["$requeststatus","-",`. ${data.status}`] } } };
    var options = { multi: true };
    var jobDetails = { filter, [updateDoc], options };
    

    See how it works on the playground example