MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

$addToSet à un tableau mais cela me donne null

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) { ... }
        );
    }
});