sql >> Databáze >  >> NoSQL >> MongoDB

$addToSet do pole, ale dává mi null

Problém je v tom, že výsledek z Product.find() je pole dokumentů Mongoose, pokud dotaz odpovídá jakýmkoli dokumentům v kolekci namísto jediného dokumentu, který chcete.

Tedy výraz {$addToSet: {products: product._id}} převede na {$addToSet: {products: undefined}} protože product je pole a product._id je nedefinováno. Vezměte si tento jednoduchý příklad

var product = [{ '_id': 1 }];
console.log(product._id) // logs undefined

Chcete-li tento problém vyřešit, můžete přistupovat k jedinému prvku v poli jako

wishList.update(
    { '_id': request.body.wishlistId },
    { '$addToSet': { 'products': product[0]._id} }, 
    function(err, wishlist) { ... }
);

Nebo použijte findOne() metoda, která při dotazu na produkt vrací jeden dokument:

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

findById() metoda je také užitečná v tomto případě, tj.

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



  1. MongoDB Nejlepší způsob, jak spárovat a odstranit sekvenční záznamy databáze

  2. mangusta odlišná a plná dokumentů

  3. Meteor.Collection.ObjectID() vs MongoDB ObjectId()

  4. Může MongoDB a jeho ovladače zachovat pořadí prvků dokumentu