【问题标题】:Auto increment / Sum one field of the query result?自动递增/求和查询结果的一个字段?
【发布时间】:2014-04-11 00:39:00
【问题描述】:

我举例说明:

我有一个包含 100 万个项目的集合,ID:123,每个项目的价值不同:“价值”

拥有 MONEY 的用户 x 可以“购买”这些物品。我基本上想知道用户可以以最优雅的方式购买多少物品。

所以我明白了。

db.items.find({Item_ID:123},{Item_Age:1,Item_worth:1}.sort({Item_age:1})

-> 给我所有 Item_ID:123 按年龄排序的项目。

我现在可以

  • 遍历所有项目直到项目价值总和 == User_Money 但不知何故,我认为如果返回的列表匹配 100 万个项目并且用户可能只有足够的钱购买 1000 个,这不是很有效

  • 循环查询 1000 次

  • 将查询限制为 100 个项目。但这变化很大,仍然可能导致很多循环

那么有没有一种查询方法可以返回每个文档中所有值的总和? 或者任何其他有效的建议可能会有所帮助。

谢谢

【问题讨论】:

  • 所以您想要前 X 个项目,按 Item_age 排序,其中 Item_worth 总和小于或等于 User_Money?

标签: mongodb


【解决方案1】:

使用mapReduce 执行此操作以获取项目的运行总计,然后过滤结果比迭代更好。

所以定义一个映射器如下:

var mapper = function () {

    totalWorth = totalWorth + this.Item_Worth;

    var canBuy = userMoney >= totalWorth;

    if ( canBuy ) {
        emit(
            {
                Item_ID: this.Item_ID,
                Item_Age: this.Item_Age
            },
            {
                worth: this.Item_Worth,
                totalWorth: totalWorth,
                canBuy: canBuy
            }
        );

    }

}

这会为totalWorth 累积一个变量,其中包含项目的当前“价值”。然后检查当前的totalWorth 值是否超过了输入的userMoney 的数量。如果没有,那么你不发射。这是自动过滤。

所有发出的键都是唯一的,所以只需运行 mapReduce,如下所示:

db.items.mapReduce(
    mapper,
    function(){},              // reduce argument is required though not called
   {
      query: { Item_ID: 123 }
      sort: { Item_ID: 1, Item_Age: 1 },
      out: { inline: 1 },
      scope: { 
          totalWorth: 0,
          userMoney: 30 
      }, 
   }
)

所以看看其他部分:

  • 查询:是用于获取选择的标准查询对象

  • sort: 不是必需的,因为您正在按升序查看Item_Age。但是,如果您首先想要最旧的Item_Age,那么您可以反转排序。

  • out:为您提供一个内联对象作为结果,您可以使用它来获取匹配项。

  • 范围:定义函数可以访问的全局变量。所以我们为totalWorth提供一个初始值,并传递userMoney的参数值作为用户需要购买的金额。

在一天结束时,结果包含用户可以购买的金额范围内的项目过滤列表。

【讨论】:

  • 哇很好的答案。我查看了 map reduce,但无法理解它,这是完美的,非常感谢!
  • 您会看到输出有点“时髦”,但 mapReduce 就是这样做的。尽管如此,它还是跳过了一些步骤,处理只是代码。很高兴它有帮助。
猜你喜欢
  • 1970-01-01
  • 2013-04-08
  • 1970-01-01
  • 2012-06-28
  • 2013-01-27
  • 2019-10-05
  • 1970-01-01
  • 1970-01-01
  • 2016-07-28
相关资源
最近更新 更多