2016-06-27 3 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

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/

関連する問題