2016-06-27 2 views
0

У меня есть массив, используя это, я хочу найти некоторые продукты. Массив, показанный ниже.Как получить результат прохождения массива в mongodb?

"productIds": [ 
    { 
    "productId": ObjectId("574592dfc07f13943255c19d") 
    }, 
    { 
    "productId": ObjectId("5745934cc07f13943255c19f") 
    }, 
    { 
    "productId": ObjectId("57459397c07f13943255c1a1") 
    } 
] 

, используя этот productId Я хочу найти конкретную продукцию. Я написал какой-то запрос, но он принимает только первый productId, и он не принимает остальных.

router.post('/getItemOfWishList', function(req,res){ 
    var wId = ObjectId(req.body.wID); 
    var findwishlists = function(db, callback) { 
     var cursor =db.collection('wishlists').find({_id: wId}).toArray(function(err, docs){ 
      if(err){ 
       callback(new Error("Some problem")); 
      }else{ 
       callback(null,docs); 
      } 
     }); 
    }; 

    MongoClient.connect(config.database, function(err, db) { 
     assert.equal(null, err); 
     findwishlists(db, function(err,docs) { 
      db.close(); 

      //console.log(docs[0].productIds);//It contains that array. 


      for(var key in docs){ 
       console.log(docs[key].productIds[key].productId); 
       var pID = ObjectId(docs[key].productIds[key].productId); 

       var findproducts = function(db, callback) { 
        var cursor =db.collection('proInfo').find({_id: pID}).toArray(function(err, docs){ 
         if(err){ 
          callback(new Error("Some problem")); 
         }else{ 
          callback(null,docs); 
         } 
        }); 
       }; 

       MongoClient.connect(config.database, function(err, db) { 
        assert.equal(null, err); 
        findproducts(db, function(err,docs) { 
         db.close(); 
         if(err) return res.json({result:null}) 
         else 
         return res.json({result: docs}); 
        }); 
       });     
      } 
     }); 
    }); 
}); 
+0

'return res.json ({result: docs});' строка останавливает цикл, я думаю. Почему вы делаете «возврат»? – Shrabanee

+0

return для получения результата от node.js до углового контроллера. – Kevin

ответ

3

Есть несколько вопросов здесь:

  1. Асинхронный поток программы неверен - for оператор запускает кучу асинхронных задач и вы не ждали их все полный.

  2. Вы отправляете ответ, как только получите первый результат - вы пишете ответ, как только findProducts вызывается в первый раз.

Вы можете решить все эти проблемы, используя оператор $in MongoDB:

MongoClient.connect(config.database, function(err, db) { 
 
    db.collection('wishlists').find({_id: wId}).toArray(function(err, wishlist) { 
 
     var productIds = wishlist.productIds.map(function(product) { 
 
     return product.productId; 
 
     }); 
 
     
 
     db.collection('products').find({_id: {$in: productIds}}).toArray(function (err, products) { 
 
     return res.json(products); 
 
     }); 
 
    }); 
 
});

Вы должны, конечно, обрабатывать все неожиданные ошибки и переделки фрагмент кода в порядке для того, чтобы он соответствовал вашему делу более точно.

Я также рекомендую немного узнать о том, как node.js обрабатывает асинхронную работу и управление потоком, поскольку вы предполагаете, что весь код будет выполняться синхронно - один за другим. Хорошим местом для начала было бы: https://blog.risingstack.com/node-hero-async-programming-in-node-js/

Смежные вопросы