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数量。