J'ai un problème lorsque j'essaie d'insérer mon objet avec de nouveaux (analysés à partir d'un fichier xml), mais j'ai eu l'erreur suivante:
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')
Voici mon 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');
});
});
J'ai essayé d'utiliser des indices comme:
//product._id = mongoose.Types.ObjectId(); //doesn't work
//delete product._id // doesn't delete _id from product
mais ils n'ont pas aidé. Je ne veux donc pas mettre à jour mon produit._id, je veux juste mettre à jour les autres champs.
Lorsque vous faites new Product()
, un nouveau _id
est généré, entre autres. Essaye ça:
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');
});
});
Vous pouvez utiliser ceci:
Product.replaceOne({ _id: 55be3c8f79bae4f80c6b17f8}, {
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});