我有一个数组,使用这个我想搜索一些产品。数组如下所示。
"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 :(得分:3)
这里有几个问题:
程序的异步流程不正确 - for
语句启动了一堆异步任务,您并没有等待所有这些任务完成。
您收到第一个结果后立即发送回复 - 第一次调用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/