如何模拟PouchDB上的聚合函数avg,sum,max,min和count?

时间:2016-08-05 02:02:06

标签: javascript indexeddb pouchdb database nosql

有谁知道如何在PouchDB数据库上创建聚合函数,例如avg,sum,max和min。我创建了一个简单的应用程序来测试PouchDB。我还没弄明白如何运行这些命令。提前谢谢。

例如。你如何获得"数字"的最高,最低或平均值?场?

  

我的主要离子2成分

import {Component} from '@angular/core';
import {Platform, ionicBootstrap} from 'ionic-angular';
import {StatusBar} from 'ionic-native';
import {HomePage} from './pages/home/home';
declare var require: any;
var pouch = require('pouchdb');
var pouchFind = require('pouchdb-find');
@Component({
    template: '<ion-nav [root]="rootPage"></ion-nav>'
})
export class MyApp {
    rootPage: any = HomePage;
    db: any;
    value: any;
    constructor(platform: Platform) {
        platform.ready().then(() => {
            StatusBar.styleDefault();
        });
        pouch.plugin(pouchFind);
        this.db = new pouch('friendsdb');
        let docs = [
            {
                '_id': '1',
                'number': 10,
                'values': '1, 2, 3',
                'loto': 'fooloto'
            },
            {
                '_id': '2',
                'number': 12,
                'values': '4, 7, 9',
                'loto': 'barloto'
            },
            {
                '_id': '3',
                'number': 13,
                'values': '9, 4, 5',
                'loto': 'fooloto'
            }
        ];
        this.db.bulkDocs(docs).then(function (result) {
            console.log(result);
        }).catch(function (err) {
            console.log(err);
        });
    }
}
ionicBootstrap(MyApp);

3 个答案:

答案 0 :(得分:3)

使用内置的 _stats reduce函数可以检索数字字段的最高值和最低值。

var myMapReduceFun = {
  map: function (doc) {
    emit(doc._id, doc.number);
  },
  reduce: '_stats'
};

db.query(myMapReduceFun, {reduce: true}).then(function (result) {
  // handle result
}).catch(function (err) {
  // handle errors
});

结果与此类似:

{"sum":35,"count":3,"min":10,"max":13,"sumsqr":214}

最高值位于&#34; max&#34; -field中,最低值位于&#34; min&#34; -field。现在你只需要计算你想要的平均值,例如平均值:

var meanAverage = result.sum / result.count;

PouchDB中的其他built-in reduce functions是_count和_sum。

PouchDB documentation说明了关于减少函数的内容:

  

提示:如果您没有使用内置功能,那么您可能做错了。

答案 1 :(得分:2)

您可以使用 public static void main(String[] args) { Scanner keyboard = new Scanner(System.in); System.out.print("Enter a prefix expression " + "using only *, +, and - operators and positive operands: "); String expression = keyboard.nextLine(); int result = evaluateExpression(expression); System.out.println(result); } / map函数of the db.query() method from PouchDB来获取文档的平均值,总和,最大值或任何其他类型的聚合。

我创建了一个demo JSBin fiddle with a running example。我将函数的解释直接添加到代码(下面)作为注释,因为我认为它更简单。

reduce

注意:这只是一种方法。还有其他几种可能性(不使用ID作为键,使用组和不同的reduce函数,使用内置的reduce函数,例如_sum,......),我只是认为这是一个更简单的替代方法。

答案 2 :(得分:0)

我是PouchDB中views的粉丝,因为这样的问题。

https://pouchdb.com/2014/05/01/secondary-indexes-have-landed-in-pouchdb.html

可以创建一个存储视图,允许您多次重新查询相同的索引:这意味着第一次通过时速度很慢(完全扫描),后面的查询将会更快,因为数据已被索引。 / p>

var db = new PouchDB('friendsdb');

var view = {
  '_id':'_design/metrics',
  'views':{
    'metrics':{
      'map':function(doc){
        // collect up all the data we are looking for
        emit(doc._id, doc.number);
      }.toString(),
      'reduce':function(keys, values, rereduce){
        var metrics = {
          sum:0,
          max:Number.MIN_VALUE,
          min:Number.MAX_VALUE,
          count:0
        };
        // aggregate up the values
        for(var i=values.length-1; i>=0; i--){
          var v = values[i];
          metrics.sum += v;
          metrics.max = (metrics.max < v) ? v : metrics.max;
          metrics.min = (metrics.min < v) ? metrics.min : v;
          metrics.count += v.count || 1;
        }
        metrics.avg = metrics.sum/metrics.count;
        return metrics;
      }.toString()
    }
  }
};

// alternately you could use a built in reduce
// if one already exists for the aggregation 
// you are looking for
//view.reduce = '_stats';

// note the addition of the view
var docs = [view
  ,{'_id':'1','number':10,'values':[1,2,3],'loto':'fooloto'}
  ,{'_id':'2','number':12,'values':[4,7,9],'loto':'barloto'}
  ,{'_id':'3','number':13,'values':[9,4,5],'loto':'fooloto'}
];

db.bulkDocs(docs).then(function(result) {
  db.query('metrics',{reduce:true},function(err, response) {
    var m = response.rows[0].value;
    console.log('smallest.: ' + m.min);
    console.log('largest..: ' + m.max);
    console.log('average..: ' + m.avg);
    console.log('count....: ' + m.count);
    console.log('Total ...: ' + m.sum);
  });
}).catch(function(err) {
  console.log(err);
});

请注意,将视图添加到数据库中的数据,以及要求将map和reduce转换为字符串的事实(函数末尾的.toString())< / p>