簡體   English   中英

如何通過在mongodb中傳遞數組來獲取結果?

[英]How to get result from passing array in 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. 該方案的異步流是不正確-在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/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM