如何从mongodb中传递数组得到结果?

时间:2016-06-27 13:23:03

标签: angularjs node.js 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});
                    });
                });                 
            }
        });
    });
});

1 个答案:

答案 0 :(得分:3)

这里有几个问题:

  1. 程序的异步流程不正确 - for语句启动了一堆异步任务,您并没有等待所有这些任务完成。

  2. 您收到第一个结果后立即发送回复 - 第一次调用findProducts时,您正在写回复。

  3. 您可以使用$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/