Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

node.js mongodb .. the (immutable) field '_id' was found to have been altered

Tags:

I have some problem when I try to upsert my object with new ones(parsed from xml file),but I got the following error:

 MongoError: exception: After applying the update to the document {_id: ObjectId('55be3c8f79bae4f80c6b17f8') , ...}, the (immutable) field '_id' was found to have been altered to _id: ObjectId('55be5f15ae 5597401724aab3') 

Here is my code:

xmlFile.product_list.product.forEach(function (product) {                      var productEntity = new Product({                         product_id: parseInt(product.id),                         parent_id: parseInt(product.parent_id),                         sku: product.sku,                         title: product.title,                         pricenormal: parseFloat(product.price_normal),                         pricewholesale: parseFloat(product.price_wholesale),                         pricewholesalelarge: parseFloat(product.price_wholesale_large),                         pricesale: parseFloat(product.price_sale),                         weight: parseFloat(product.weight),                         volume: parseFloat(product.volume),                         unittype: product.unit_type,                         status: product.status,                         datecreating: product.datecreating,                         sp: product.sp,                         guaranteeext: product.guarantee_ext,                         used: product.used,                         statusfull: product.status_full,                         description: null,                         url: null                     });                     items.push(productEntity);                  });   items.forEach(function (product) { //update or create new products                      Product.findOneAndUpdate({product_id: product.product_id}, product, {upsert: true}, function (err) {                         if (err)  return updateDBCallback(err);                         updateDBCallback(null, 'saved');                      });                  }); 

I tried to use hints like:

                //product._id = mongoose.Types.ObjectId(); //doesn't work                 //delete product._id // doesn't delete _id from product 

but they didn't help. So I don't want to update my product._id , I just want to update the other fields.

like image 656
MeetJoeBlack Avatar asked Aug 02 '15 18:08

MeetJoeBlack


1 Answers

When you do new Product(), a new _id is generated, along with other things. Try this:

items.forEach(function (product) { //update or create new products    // Es6 assign   var productToUpdate = {};   productToUpdate = Object.assign(productToUpdate, product._doc);   delete productToUpdate._id;    Product.findOneAndUpdate({product_id: product.product_id}, productToUpdate,                           {upsert: true}, function (err) {     if (err)  return updateDBCallback(err);        updateDBCallback(null, 'saved');    });  }); 
like image 83
Alfonso Embid-Desmet Avatar answered Oct 12 '22 23:10

Alfonso Embid-Desmet