0

node.js と OracleDB を使用して、1 対多の関係で 2 つのテーブルを結合しています。

例えば:

RECORDS Table:
RECORD_ID   COMMENTS
1000        Comment 1
1001        Comment 2

デバイス テーブル:

DEVICE_ID   REF_RECORD_ID   DEVICE_NAME
2000        1000            iPhone 6
2001        1000            iPhone 7
2003        1001            Samsung Galaxy S6
2004        1001            Samsung Galaxy S7

を使用して結合を取得できます

SELECT A.RECORD_ID, A.COMMENT, B.DEVICE_ID, B.DEVICE_NAME FROM RECORDS A, DEVICES B WHERE A.RECORD_ID = B.REF_RECORD_ID;

現在の結果:

[{
    RECORD_ID: 1000, COMMENT: "Comment 1", DEVICE_ID: 2000, DEVICE_NAME: "iPhone 6"
},
{
    RECORD_ID: 1000, COMMENT: "Comment 1", DEVICE_ID: 2001, DEVICE_NAME: "iPhone 7"
},
{
    RECORD_ID: 1001, COMMENT: "Comment 2", DEVICE_ID: 2003, DEVICE_NAME: "Samsung Galaxy S6"
},
{
    RECORD_ID: 1001, COMMENT: "Comment 2", DEVICE_ID: 2004, DEVICE_NAME: "Samsung Galaxy S7"
}]

しかし、私は以下に示すような結果が欲しいです:

[{
    RECORD_ID: 1000, COMMENT: "Comment 1",
    DEVICES: [{ DEVICE_ID: 2000, DEVICE_NAME: "iPhone 6" }, { DEVICE_ID: 2001, DEVICE_NAME: "iPhone 7" }]
},
{
    RECORD_ID: 1001, COMMENT: "Comment 2",
    DEVICES: [{ DEVICE_ID: 2003, DEVICE_NAME: "Samsung Galaxy S6" }, { DEVICE_ID: 2004, DEVICE_NAME: "Samsung Galaxy S7" }]
}]

オブジェクトの配列をループして重複する RECORD_ID を見つけ、配列を作成してサブアイテムをプッシュするよりも、これを行うためのより良い方法はありますか?

4

1 に答える 1

0

ネストされたカーソル式がサポートされている場合は、指定した出力を直接実行できます。他の人がここで同じものを探していることがわかります: https://github.com/oracle/node-oracledb/issues/565

それまでの間、結果セットを取得した後に Node.js でこれを実行できるコードの例を次に示します。

var resultRowsIdx;
var resultRows = [{
    RECORD_ID: 1000, COMMENT: "Comment 1", DEVICE_ID: 2000, DEVICE_NAME: "iPhone 6"
},
{
    RECORD_ID: 1000, COMMENT: "Comment 1", DEVICE_ID: 2001, DEVICE_NAME: "iPhone 7"
},
{
    RECORD_ID: 1001, COMMENT: "Comment 2", DEVICE_ID: 2003, DEVICE_NAME: "Samsung Galaxy S6"
},
{
    RECORD_ID: 1001, COMMENT: "Comment 2", DEVICE_ID: 2004, DEVICE_NAME: "Samsung Galaxy S7"
}];
var records = [];
var recordsMap = {};
var currentRecordId;

for (resultRowsIdx = 0; resultRowsIdx < resultRows.length; resultRowsIdx += 1) {
  currentRecordId = resultRows[resultRowsIdx].RECORD_ID;

  if (!recordsMap[currentRecordId]) {
    recordsMap[currentRecordId] = {};
    recordsMap[currentRecordId].RECORD_ID = currentRecordId;
    recordsMap[currentRecordId].COMMENT = resultRows[resultRowsIdx].COMMENT;
    recordsMap[currentRecordId].DEVICES = [];

    records.push(recordsMap[currentRecordId]);
  }

  recordsMap[currentRecordId].DEVICES.push({
    DEVICE_ID: resultRows[resultRowsIdx].DEVICE_ID,
    DEVICE_NAME: resultRows[resultRowsIdx].DEVICE_NAME
  });
}

console.log(records);
于 2016-12-21T23:54:39.393 に答える