3

次のようなドキュメントのコレクションが与えられた場合:

{ 
  "Name": "A",
  "Price": 1.50
}

リスト内の価格を簡単に集計するにはどうすればよいですか? グループ化を実行したくありません。単純なスカラー結果だけです。

すなわち。合計、平均など

次の両方を試しましたが、成功しませんでした。

地図のみ:

for doc in docs
select new { sumPrices = Sum(d => d.Price) }

地図

for doc in docs
select new { price = d.Price }

減らす:

for result in results
select new { sumPrices = Sum(result) }
4

2 に答える 2

3

これでうまくいくはずです。

地図:

from doc in docs.Products
select new { Name = "Total", Total = doc.Price }

減らす:

select new
{
    Name = g.Key,
    Total = g.Sum(x => (double)x.Total)
}

各ドキュメントは Map を通過し、集約は Reduce で行われます。ただし、マップから出力されるスキーマは、結果と一致する必要があります。各ドキュメントの「合計」は、その価格です。これらはすべて reduce で合計されます。

Name プロパティは役に立たないもので、reduce にすべてのドキュメントをグループ化するためのものです。

于 2011-10-08T12:35:01.903 に答える
0

これが私が思いついたものです。

地図:

from doc in docs 
where doc["@metadata"]["Raven-Entity-Name"] == "Books" 
select new { Name = "Total", Price = doc.Price };

減らす:

from result in results 
group result by result.Name 
into g 
select new { Name = g.Key, Price = g.Sum(x => x.Price) }

ただし、価格を整数に変更した場合にのみ、これを機能させることができました。したがって、私の2つのドキュメントは次のようになります。

{
    "Name":"B",
    "Price":4
}
{
    "Name":"A",
    "Price":10
}

そして、私の JSON 出力は次のようになります。

{"Results":[{"Name":"Total","Price":"14","Price_Range":"14"}],"IsStale":false,"TotalResults":1}

明らかに、価格を整数に変更することは解決策ではありません。これは RavenDB のバグかもしれませんが、私自身はかなり慣れていないので、自分のSum()やり方やドキュメントでのデータの表現方法に問題がないことを願っています。

于 2010-08-03T22:02:27.097 に答える