试图了解mongodb的findOne函数的行为及其导致以下问题的原因

时间:2016-08-04 19:34:15

标签: node.js mongodb express mongoose

我在这里尝试做的是通过id找到用户,如果找不到用户,那么我将它添加到集合中。但是,如果找到,我只想将新产品推送到现有用户的文档中。

这里的问题是for循环中的以下if语句:

    for(var i=0; i < data.products.length; i++) {
        console.log("Product    
        found:"+!data.products[i].product.equals(req.body._id));
        //if the requested product is not found 
        if(!data.products[i].product.equals(req.body._id)){
            data.products.push({product: req.body._id, isAdded: true,
            quantity:1});         
        }
        console.log("Adding product.....");             
     }//for loop 

似乎第一次迭代发现条件为true,即使我已经有一个具有相同id的产品。只要我的文档中存在id,它就应该是false。有人能够解释一下Mongoose的这种行为吗?

for循环中的console.log返回以下结果:

    Product found:true
    Adding product.....
    Product found:false
    Adding product.....
    Product found:false
    Adding product.....
    Product found:false
    Adding product.....

    api.post('/me/cart', wagner.invoke(function(Cart) {
        return function(req, res, next) {
            console.log("new post request"+ req.headers['usr'] );

            Cart.findOne({userId: req.headers['usr']}, 
            function(err,data){
                if(err){
                    throw err;
                }
                console.log("found this..."+ (!data));
                //if No user is found add a new cart
                if(!data && data.length < 0){
                    var cart = new Cart();
                    cart.userId = req.headers['usr'];
                    cart.products.push({product: req.body._id,
                    quantity:1, isAdded:true});
                    cart.save(function(error, data) {
                        if (error){
                           return res.
                           status(status.INTERNAL_SERVER_ERROR).
                           json({ error: error.toString() });
                        };
                        return res.json({ product: data });
                    });
               }
               //if user is found updated found users cart
               else if (data){            
                   for(var i=0; i < data.products.length; i++){
                       //if the requested product is not found 
                       if(!data.products[i].product.equals(req.body._id)){
                           data.products.push({product: req.body._id,   
                           isAdded: true, quantity:1});         
                       }
                       console.log("Adding product.....");             
                   }//for loop             
                   data.save(function(err, updatedCart){
                       if(err)
                          throw err;
                       console.log(updatedCart);
                       return res.json(updatedCart);
                   });
               }//else if
            });
    };

1 个答案:

答案 0 :(得分:0)

我做错了。循环基础的基本原则lol很明显,每次找不到产品ID时条件都是正确的,因此每次找不到id时都会执行push语句。这将导致它在数据库中创建重复数据。 解决方案只是在if条件中添加boolean标志,如果找不到值则将其打开,然后使用该标志保存并推送新产品。

P.s卡住了丢失的分号类型的问题3天大声笑只是因为我忘记了次要的循环基础。无论如何,错误是教给我们最好的东西:D Enjoy。