2015-08-02 16 views
9

Ho qualche problema quando provo a spostare il mio oggetto con nuovi (analizzato dal file xml), ma ho ricevuto il seguente errore :node.js mongodb .. il campo (immutabile) '_id' è stato trovato modificato

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') 

Ecco il mio codice:

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'); 

        }); 

       }); 

ho provato ad utilizzare i parametri come:

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

ma non ha aiutato. Quindi non voglio aggiornare my product._id, voglio solo aggiornare gli altri campi.

risposta

13

Quando si esegue new Product(), viene generato un nuovo _id, insieme ad altre cose. Prova questo:

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'); 

    }); 

}); 
+1

Quando ho provato ad usare Object.assign con il nodo v0.12.7 I got 'TypeError: undefined non è una funzione', così ho dovuto usare questo shim https://www.npmjs.com/pacchetto/oggetto-assegnazione – wytten

Problemi correlati