1

node-linq を使用し、GroupBy を理解しようとしていますが、ドキュメントはほとんどありません。

たとえば、私はこのデータを持っています:

{"日付":"2013/06/26","名前":"A","番号":1}

{"日付":"2013/06/26","名前":"A","番号":5}

{"日付":"2013/06/27","名前":"B","番号":4}

{"日付":"2013/06/27","名前":"A","番号":4}

そして、このクエリのように書きたいのですが、ノードjsのLINQを使用します

SELECT date, name, SUM(number)
FROM data
GROUPBY date, name

このコードを試してみましたが、エラーが発生しました

var o = new LINQ(data)
        .Select(function(name,d) {return name.statement,d.date;})
        .SUM((function(x) {return x.number;)
        .GroupBy(function(name,d) {return name.statement,d.date;}
    .ToArray()
                

GroupBy について何か提案や例がありますか? ありがとう

4

2 に答える 2

3

.GroupBygithub の README にあることがわかりますが、そうするとあり.GroupByませんnpm install node-linq。したがって、モジュールをインストールする必要があります

npm install https://github.com/wearefractal/node-linq/tarball/master

これはあなたのデータです:

var LINQ = require('node-linq').LINQ;

var data = [ { date: '2013/06/26', name: 'A', number: 1 },
             { date: '2013/06/26', name: 'A', number: 5 },
             { date: '2013/06/27', name: 'B', number: 4 },
             { date: '2013/06/27', name: 'A', number: 4 } ];

まず、それらをグループ化します。残念ながら、ハッシュでグループ化できないため、代理キーを使用する必要があります。

var o = new LINQ(data).GroupBy(function(row) { return row.date + '~' + row.name; });
console.log(o);

これは出力です:

{ '2013/06/26~A':
   [ { date: '2013/06/26', name: 'A', number: 1 },
     { date: '2013/06/26', name: 'A', number: 5 } ],
  '2013/06/27~B': [ { date: '2013/06/27', name: 'B', number: 4 } ],
  '2013/06/27~A': [ { date: '2013/06/27', name: 'A', number: 4 } ] }

次に、数値を合計したいのですが、できません。

console.log(o.__proto__); // {}

おそらく、それをラップする必要がありますLINQか?

new LINQ(o); // InvalidCastException: Data not Array

いいえ。

キーを失ってオブジェクトを配列に変換しましょう。JavaScript には存在Object.values()しないため、次のようにする必要があります。

o = new LINQ(Object.keys(o).map(function(key) { return o[key] }));

これで、最終的にすべての数値を合計できます。

o = o.Select(function(rows) { return { date: rows[0].date, name: rows[0].name, sum: new LINQ(rows).Sum(function(row) { return row.number; }) } }).ToArray();
console.log(o);

結果は次のとおりです。

[ { date: '2013/06/26', name: 'A', sum: 6 },
  { date: '2013/06/27', name: 'B', sum: 4 },
  { date: '2013/06/27', name: 'A', sum: 4 } ]

あまりきれいではありません。

アンダースコア

npm install underscore

underscoreライブラリを使用してデータをグループ化する方法は次のとおりです。

var _ = require('underscore')._;

var data = [ { date: '2013/06/26', name: 'A', number: 1 },
             { date: '2013/06/26', name: 'A', number: 5 },
             { date: '2013/06/27', name: 'B', number: 4 },
             { date: '2013/06/27', name: 'A', number: 4 } ];

var grouper = function(row) { return row.date + '~' + row.name; };
var summer = function(rows) { return rows.reduce(function(sum, row) { return sum + row.number; }, 0); };

var o  = _.chain(data)
          .groupBy(grouper)
          .map(function(rows) { return { date: rows[0].date, name: rows[0].name, sum: summer(rows) }; })
          .value();

console.log(o); // same result

ずっといいと思います。

于 2013-06-27T15:57:55.793 に答える