node.js / javascript在其他数组内添加一个数组作为子节点

描述:我对一个表执行一个mysql查询,并取回一些行

> connection.query(q2,function(err,rows){...} 

可以说,行看起来像{id:",,,", time:"..." etc:"cc"}接下来,为每一行我查询另一个表,并取回一些让我们说基于行的ID 。 可以有0-100行依赖于查询

 > for (var i = 0; i < rows.length; i++){ > connection.query(qc,function(err2,coms){ 

可以说coms看起来像这样{ rowid:",,,", something:"ddd" smthelse:"ff"}每行也可以有0 – 100个com。问题:

我怎样才能在行内添加coms,所以对于每一行我有coms我从表中返回? 我想要这样的东西

 > {id:"1", time:"..." etc:"cc" coms:{ rowid:",,,", something:"ddd" > smthelse:"ff"}} 

已经尝试过了: rows[i].comms=coms; (not working) rows[i].comms[j]=coms[j]; (不工作) rows[i].push(coms) (不工作) rows.comms=coms; (工作,但它不是我想要的,与此我得到多次相同的数据)

我在第一次查询后使用的整个代码

  connection.query(q2,function(err,rows){ // connection.release(); if(!err) { // rows["coms"]=[]; for (var i = 0; i < rows.length; i++){ var qc="select * from comms where id='"+rows[i].id+"' order by com_id"; connection.query(qc,function(err2,coms){ if(!err2) { // rows[i].cid=coms.com_id; // rows[i].coms=[]; rows[i]="coms"; for (var j = 0; j < coms.length; j++){ // data[i][j]=coms[j]; // rows[i].coms[j]=coms[j]; // rows[i][j].coms=coms[j]; } // data[i]=coms; // rows[i]["coms"]=coms; // console.log(rows); } }); } // rows.push(data); console.log(rows); users[index].emit('data',rows); } connection.release(); }); 

我没有任何可用的MySQL数据库来testing这个,但是我希望能够得到这个观点或者给出一些好的想法。

 var Promise = require("bluebird"); // This is a "promisified" version of connection.query function query(con, sql) { return new Promise(function(resolve, reject) { con.query(sql, function(err, rows) { if (err) { reject(new Error(err)); } else { resolve(rows); } }); }); } 

你的代码现在可以翻译成这样的东西:

 query(connection, q2) .then(function(rows) { return Promise.map(rows, function(row) { var qc = "select * from comms where id='"+row.id+"' order by com_id"; return query(connection, qc).then(function(coms) { // Do whatever you want with result of second query here row.coms = coms; return row; }) }) }) .then(function(rows) { // All promises have resolved here, rows is an array of values users[index].emit('data', rows); }) .catch(function(err) { // Handle errors here }); 

你为什么不改变你的第二个查询的WHERE id = row [i] .id到WHERE id IN(id)来获取你的数据。 在sql server上更容易,处理代码更容易。 首先获取要传递给IN()条件的Ids列表。 当数据返回时,您可以遍历父行并筛选子节点行并将其作为所需属性附加到父项。 你可能想使用underscorejs库来帮助你收集操作。

将所有的子序列select合并到一个select中将加快您的查询速度; 因为它将摆脱所有需要进行连接和查询到SQL服务器到一个连接和一个查询的头。 想象一下,如果你的第一个查询返回100,1000,10,000行。 你的sql服务器将会带有一些子序列查询的性能。

我不相信有一个查询的最大长度; 所以你可以疯狂IN()条件内的ID数量。