如何将对象数组设置回从MongoDB中的嵌套find()迭代的集合?

我使用AngularJS,NodeJS和MongoDB开发应用程序。 我想加载产品,从ProductCategoryCode分类从AngualrJS发送到NodeJS。 首先,我需要通过ProductCategoryCode查找产品,然后遍历每个产品,以通过UomCode和ContainUomCodefindUoms,每个产品都应该有2个uom。 如何将uom对象docUom设置回产品文档doc[i]并更新到产品集合doc

对于下面的代码行

 doc[i].Uom = docUom; 

系统抛出错误不能设置未定义的属性“Uom”。

这里是product.js代码片断。

 router.get("/LoadProductByProductCategoryCode/:productCategoryCode", function (req, res) { console.log('user.js -> /users '); var productCategoryCode = req.params.productCategoryCode; console.log(productCategoryCode ); var MongoClient = require('mongodb').MongoClient, format = require('util').format; MongoClient.connect('mongodb://localhost:27017/NodeDB', function (err, db) { if (err) throw err; var query = { ProductCategoryCode : productCategoryCode} var new_product = []; findProduct(db, query, function (err, doc) { if(err) { // something went wrong console.log(err); return; } if (doc) { console.log("Found Product..."+doc.length); for (var i = 0; i < doc.length; i++) { console.log(doc[i].ProductCode + " each document " + doc[i].UomCode + " " + doc[i].ContainUomCode); var qUom = { $or: [ { UomCode: doc[i].UomCode}, { UomCode: doc[i].ContainUomCode } ] } // Find uom findUom(db, qUom, function(errUom, docUom) { if(errUom) { console.log("error " + errUom); return; } if (docUom) { doc[i].Uom = docUom; console.dir(product); } }); } res.json(doc); } else { console.log('something happen'); } }); //End }); // MongoClient var findProduct = function (db, query, callback) { db.collection('Product').find(query).toArray(function (err, doc) { if(err) { callback(err); } else { callback(null, doc); } }); } var findUom = function(db, queryUom, callback) { db.collection('Uom').find(queryUom).toArray(function (err, doc) { // db.close(); if(err) { callback(err); } else { callback(null, doc); } }); } }); 

任何想法? 谢谢

由于Node.js MongoDB驱动程序的asynchronous特性, findProduct()findUom()方法都会启动,但是到达res.json(doc)时不一定会完成,这意味着doc仍然是空的。 您期望这种方式以线性方式工作,但节点的工作方式不同。

相反,一旦所有的asynchronous调用完成,你应该发回你的响应,这意味着你可以尝试这样的:

 findProduct(db, query, function (err, doc) { if(err) { // something went wrong console.log(err); return; } var processedProduct = function (item) { console.log(item.ProductCode + " each document " + item.UomCode + " " + item.ContainUomCode); var qUom = { $or: [ { UomCode: item.UomCode}, { UomCode: item.ContainUomCode } ] } // Find uom findUom(db, qUom, function(errUom, docUom) { if(errUom) { console.log("error " + errUom); return; } if (docUom) { item.Uom = docUom; console.dir(product); return item; } }); } if (doc) { var productsToFind = doc.length; var products = []; console.log("Found Products..." + productsToFind); for (var i = 0; i < doc.length; i++) { product = doc[i]; product = processedProduct(product); products.push(product); productsToFind -= 1; if(productsToFind === 0){ res.json(products); } } } else { console.log('something happen'); } }); //End 

我可以更好地解释asynchronous调用和callback,因为这个主题有点宽泛,但从上面你可以得到这样的想法,我已经使用计数器productsToFind所有的内部asynchronous调用,每一次findUom()调用完成此计数器递减一旦达到0,意味着所有的callback已经被解雇了。