自动递增/求和查询结果的一个字段?

时间:2014-03-07 17:57:02

标签: mongodb

我用一个例子来解释:

我有一个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但不知何故我认为如果List返回匹配1百万个项目并且用户可能只有足够1000的钱
  • ,那么效率不高

  • 执行循环并查询1000次

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

SO是否有一个查询方法,它返回每个文档中所有值的总和? 或者任何其他有效的建议可能会有所帮助。

由于

1 个答案:

答案 0 :(得分:0)

使用mapReduce进行迭代会更好地获取项目的运行总计,然后过滤结果。

所以定义一个mapper如下:

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

所以看看其他部分:

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

  • 排序:确实不需要,因为您按升序查看Item_Age。但如果您想先使用最早的Item_Age,那么您可以撤销排序。

  • out:为您提供内联对象,以便您可以使用它来获取匹配的项目。

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

在一天结束时,结果中包含已过滤的项目清单,这些项目的金额低于用户可以购买的金额。