CouchDB减少对象然后进行计算

时间:2018-09-11 08:17:17

标签: couchdb

Couchdb新手。

好吧,我有这样的文档

id: x
type: project,
propertyId: y
items: [{
   spent: 10
   budget: 20
   quantity: 1
 },
 {
   spent: 20
   budget: 40
   quantity: 1
  }
]

我想算出按物业ID分组的总花费百分比,

{key: y, percent: 0.5}

此刻我有两种看法

//花费的财产

    map: function(doc) {
      if (
        doc.type === "project" &&
        doc.propertyId &&
        doc.status === "active"
      ) {
        var spent = Object.values(doc.items).reduce(function(total, item) {
          return total + item.spent
        }, 0)
        emit([doc.propertyId, doc._id], spent)
      }
    }.toString(),
    reduce: "_sum"

//财产预算

    map: function(doc) {
      if (
        doc.type === "project" &&
        doc.propertyId &&
        doc.status === "active"
      ) {
        var budget = Object.values(doc.items).reduce(function(total, item) {
          const qty = item.quantity || 1
          const budget = item.budget || 0
          return total + budget * qty
        }, 0)
        emit([doc.propertyId, doc._id], budget)
      }
    }.toString(),
    reduce: "_sum"

然后我从客户应用程序中调用两者,并计算我的应用程序中的百分比。

我想知道如何在一次通话中完成此操作

这样我的地图函数看起来就像

    map: function(doc) {
      if (doc.type === "project" && doc.propertyId) {
        const totals = Object.values(doc.items).reduce(
          function(total, item) {
            return {
              budget: total.budget + item.budget * item.qty,
              spent: total.budget + item.spent
            }
          },
          { budget: 0, spent: 0 }
        )
        emit([doc.propertyId, doc._id], totals)
      }
    }
    reduce: function(keys, values, rereduce) {
      const sum = values.reduce(
        function(sum, total) {
          return {
            spent: sum.spent + total.spent,
            budget: sum.budget + total.budget
          }
        },
        { spent: 0, budget: 0 }
      )
      return sum.budget ? sum.spent / sum.budget : 0

但这根本不能给出正确的结果

0 个答案:

没有答案