代码之家  ›  专栏  ›  技术社区  ›  mwjackson

RavenDB:如何进行简单的map/reduce聚合

  •  3
  • mwjackson  · 技术社区  · 14 年前

    好吧,如果有这样一组文件:

    { 
      "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) }
    
    2 回复  |  直到 14 年前
        1
  •  3
  •   Dan Turner    13 年前

    这应该能奏效。

    地图:

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

    减少:

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

    每个文档都会遍历映射,并在Reduce中进行聚合。但是映射出来的模式仍然需要与您的结果匹配。每个文档的“总数”只是它的价格。所有这些都在reduce中求和。

    Name属性有点无用,它只是给reduce一些东西来对每个文档进行分组。

        2
  •  0
  •   jgauffin    12 年前

    这是我想到的。

    地图:

    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) }
    

    然而,我只能得到这个工作,如果我改变了价格为整数。我的两个医生是这样的:

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

    我的JSON输出如下所示:

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

    显然,将价格改为整数并不是解决办法。这可能是RavenDB的一个bug,但我自己对它还很陌生,所以我希望这就是我的工作方式 Sum() 或者数据在文档中的表示方式。