Le problème est que le résultat de Product.find()
est un tableau de documents Mongoose si la requête correspond à tous les documents de la collection au lieu d'un seul document que vous voulez.
Ainsi l'expression {$addToSet: {products: product._id}}
se résout en {$addToSet: {products: undefined}}
car product
est un tableau et product._id
est indéfini. Prenons cet exemple simple
var product = [{ '_id': 1 }];
console.log(product._id) // logs undefined
Pour remédier à ce problème, vous pouvez soit accéder au seul élément du tableau en tant que
wishList.update(
{ '_id': request.body.wishlistId },
{ '$addToSet': { 'products': product[0]._id} },
function(err, wishlist) { ... }
);
Ou utilisez le findOne()
méthode qui renvoie un seul document lors de la requête sur le produit :
Product.findOne({ '_id': request.body.productId }, function(err, product) {
if(err) {
response.status(500).send({err: "could not add item to wishlist"});
} else {
wishList.update(
{ '_id': request.body.wishlistId },
{ '$addToSet': { 'products': product._id } },
function(err, wishlist) { ... }
);
}
});
Le findById()
est également utile dans ce cas, c'est-à-dire
Product.findById(request.body.productId, function(err, product) {
if(err) {
response.status(500).send({err: "could not add item to wishlist"});
} else {
wishList.update(
{ '_id': request.body.wishlistId },
{ '$addToSet': { 'products': product._id } },
function(err, wishlist) { ... }
);
}
});