【问题标题】:Trying to understand mongodb's findOne function's behaviour and why it's causing the following issue试图了解 mongodb findOne 函数行为及其导致以下问题的原因
【发布时间】:2016-12-11 02:02:18
【问题描述】:

我在这里要做的是通过 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 

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

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

【问题讨论】:

    标签: node.js mongodb express mongoose


    【解决方案1】:

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

    P.s 被缺少分号类型的问题困扰了 3 天,哈哈,只是因为我忘记了次要的 for 循环基础。无论如何,错误是最能教给我们的:D 享受。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-28
      • 2011-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多