MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

$ addToSet para uma matriz, mas me dá null


O problema é que o resultado de Product.find() é uma matriz de documentos do Mongoose se a consulta corresponder a qualquer documento da coleção em vez de um único documento que você deseja.

Assim, a expressão {$addToSet: {products: product._id}} resolve para {$addToSet: {products: undefined}} porque product é uma matriz e product._id é indefinido. Veja este exemplo simples
var product = [{ '_id': 1 }];
console.log(product._id) // logs undefined

Para remediar este problema, você pode acessar o único elemento na matriz como
wishList.update(
    { '_id': request.body.wishlistId },
    { '$addToSet': { 'products': product[0]._id} }, 
    function(err, wishlist) { ... }
);

Ou use o findOne() método que retorna um único documento ao consultar o produto:
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) { ... }
        );
    }
});

O findById() também é útil neste caso, ou seja.
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) { ... }
        );
    }
});