【问题标题】:How to Map Reduce nested arrays with Underscore.js如何使用 Underscore.js 映射 Reduce 嵌套数组
【发布时间】:2014-08-13 19:03:17
【问题描述】:

给定:

appliedDoses = {
  "_id": "MAIN",
  "scheme": {
    "_id": "MAIN_SCHEME",
    "name": "ESQUEMA CLASICO",
    "vaccines": [
      {
      "_id": "BCG",
      "__v": 0,
      "doses": [
        {
        "_id": "BCG_UNICA",
        "frequencies": [
          {
          "_id": "BCG_UNICA_RECIEN_NACIDO",
          "group_type": {
            "_id": "RECIEN_NACIDO",
            "name": "RECIEN NACIDO"
          },
          "__v": 0,
          "status": true,
          "number_applied": 10
        }, ...

我想要的是过滤group_type.id == "RECIEN_NACIDO"doses[]._id == "BCG_UNICA"然后得到frequencies[].number_applied的总和

我试过了:

async.each(appliedDose, function(scheme){
  async.each(scheme.scheme.vaccines, function(vaccine){
    async.each(vaccine.doses, function(dose){ 
      if(dose._id == getDose) {
        async.each(dose.frequencies, function(frequencie){
          if(frequencie.group_type._id == getGroup) {
            applied += frequencie.number_applied;
          }
        });
      }
    });
  });
});

但是我的代码效率不高,我想知道是否可以使用 MapReduce 来改进它。有人可以给我一个提示吗?非常感谢您的帮助!

【问题讨论】:

  • 您已经用 MongoDB 标记了这个问题(并提到了 MapReduce),但正如所描述的,这似乎是一个客户端对象。您给定的对象是否意味着是一个 MongoDB 文档,而您的查询是一种连接来自多个集合的数据的方式?关于您尝试解决的问题的更多背景信息会有所帮助。
  • 我将 MongoDB 更改为 mapreduce 标签,是的,我从以下代码行获得了 MongoDB 文档:AppliedDose.find() .where('clue').equals(clue) .where('applied_date') .gte( startDate ).lte( endDate ) .exec( function( err, appliedDose ) {

标签: javascript node.js mapreduce nested underscore.js


【解决方案1】:

我对您正在处理的对象有点困惑,所以我将尝试处理抽象。如果您将其分解,您可能希望在这里执行的操作会更容易、更快。

获取过滤结果的集合:group_type._id == "RECIEN_NACIDO" && doses._id

使用 _.pluck 将 number_applied 的数组取出

用 sum 减少它:_.reduce(numAppliedArray, function(sum, x) { return sum + x}, 0);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-17
    • 2015-02-03
    • 1970-01-01
    • 2023-01-18
    • 2014-11-28
    • 2019-08-13
    • 2021-09-30
    • 2018-03-09
    相关资源
    最近更新 更多