javascript - 如何将文档字段重组为数组

标签 javascript node.js mongodb mongoose nosql

我有一些数据如下所示:

{
  "name" : "someValue",
  "date" : "someValue",
  "age" : "someValue",
  "price" : "someValue",
  "sales_comp1" : "someValue",
  "sales_comp1_dos" : "someValue",
  "sales_comp1_units" : "someValue",
  "sales_comp1_NOI_unit" : "someValue",
  "sales_comp1_sales_pr_unit" : "someValue",
  "sales_comp1_adj_SPrice" : "someValue",
  "sales_comp1_cap_rate" : "someValue",
  "sales_comp2" : "someValue",
  "sales_comp2_dos" : "someValue",
  "sales_comp2_units" : "someValue",
  "sales_comp2_NOI_unit" : "someValue",
  "sales_comp2_sales_pr_unit" : "someValue",
  "sales_comp2_adj_SPrice" : "someValue",
  "sales_comp2_cap_rate" : "someValue",
  "sales_comp3" : "someValue",
  "sales_comp3_dos" : "someValue",
  "sales_comp3_units" : "someValue",
  "sales_comp3_NOI_unit" : "someValue",
  "sales_comp3_sales_pr_unit" : "someValue",
  "sales_comp3_adj_SPrice" : "someValue",
  "sales_comp3_cap_rate" : "someValue"
}

我想将 sales_compX 值合并到一个名为 salesComps 的数组中,如下所示:

{
  "name" : "someValue",
  "date" : "someValue",
  "age" : "someValue",
  "price" : "someValue",
  "salesComps" : [
    {
      "sales_comp1" : "someValue",
      "sales_comp1_dos" : "someValue",
      "sales_comp1_units" : "someValue",
      "sales_comp1_NOI_unit" : "someValue",
      "sales_comp1_sales_pr_unit" : "someValue",
      "sales_comp1_adj_SPrice" : "someValue",
      "sales_comp1_cap_rate" : "someValue",
    },
    {
      "sales_comp2" : "someValue",
      "sales_comp2_dos" : "someValue",
      "sales_comp2_units" : "someValue",
      "sales_comp2_NOI_unit" : "someValue",
      "sales_comp2_sales_pr_unit" : "someValue",
      "sales_comp2_adj_SPrice" : "someValue",
      "sales_comp2_cap_rate" : "someValue",
    },
    {
      "sales_comp3" : "someValue",
      "sales_comp3_dos" : "someValue",
      "sales_comp3_units" : "someValue",
      "sales_comp3_NOI_unit" : "someValue",
      "sales_comp3_sales_pr_unit" : "someValue",
      "sales_comp3_adj_SPrice" : "someValue",
      "sales_comp3_cap_rate" : "someValue"
    }
  ]
}

最简单的方法是什么?如果您能在 Mongoose 或 Mongodb 代码示例中得到任何回复,我将不胜感激!

最佳答案

首先,使用 Object.keys() 循环访问数据,并等待“sales_comp”数据出现。当它将键值对插入到持有对象中并从主数据中删除该条目时。完成后,将持有对象添加回数据中。像这样的事情...

数据...

var data = {
  "name" : "someValue",
  "date" : "someValue",
  "age" : "someValue",
  "price" : "someValue",
  "sales_comp1" : "someValue",
  "sales_comp1_dos" : "someValue",
  "sales_comp1_units" : "someValue",
  "sales_comp1_NOI_unit" : "someValue",
  "sales_comp1_sales_pr_unit" : "someValue",
  "sales_comp1_adj_SPrice" : "someValue",
  "sales_comp1_cap_rate" : "someValue",
  "sales_comp2" : "someValue",
  "sales_comp2_dos" : "someValue",
  "sales_comp2_units" : "someValue",
  "sales_comp2_NOI_unit" : "someValue",
  "sales_comp2_sales_pr_unit" : "someValue",
  "sales_comp2_adj_SPrice" : "someValue",
  "sales_comp2_cap_rate" : "someValue",
  "sales_comp3" : "someValue",
  "sales_comp3_dos" : "someValue",
  "sales_comp3_units" : "someValue",
  "sales_comp3_NOI_unit" : "someValue",
  "sales_comp3_sales_pr_unit" : "someValue",
  "sales_comp3_adj_SPrice" : "someValue",
  "sales_comp3_cap_rate" : "someValue"
};

代码...

// holding Object
var tmpStorage = {};

// Loop through the data
Object.keys(data).forEach(function(d) {
     // look for 'sales_comp' keys
     if (/sales_comp/.test(d)) {
         // find which 'sales_comp' each 'd'
         // belongs to with simple regex (allowing
         // for more than single digits here)
         var id = d.match(/sales_comp([\d]+)/)[1];
         // create a tmp property for tmpStorage object
         // if it doesn't exist (which it wont on the
         // the first pass)
         tmpStorage['tmp'+id] = tmpStorage['tmp'+id] || {};
         // add the current key-value pair to the
         // tmpStorage Object
         tmpStorage['tmp'+id][d] = data[d];
         // remove the current key-value pair from the
         // data object
         delete data[d]
     }
});

“数据”对象现在看起来像这样......

console.log('data:',data);
/* =>
data: {
  name: 'someValue',
  date: 'someValue',
  age: 'someValue',
  price: 'someValue'
}
*/

tmpStorage 对象看起来像这样......

console.log('tmpStorage:',tmpStorage);
/* =>
tmpStorage: {
  tmp1: {
     sales_comp1: 'someValue',
     sales_comp1_dos: 'someValue',
     sales_comp1_units: 'someValue',
     sales_comp1_NOI_unit: 'someValue',
     sales_comp1_sales_pr_unit: 'someValue',
     sales_comp1_adj_SPrice: 'someValue',
     sales_comp1_cap_rate: 'someValue'
  },
  tmp2: {
     sales_comp2: 'someValue',
     sales_comp2_dos: 'someValue',
     sales_comp2_units: 'someValue',
     sales_comp2_NOI_unit: 'someValue',
     sales_comp2_sales_pr_unit: 'someValue',
     sales_comp2_adj_SPrice: 'someValue',
     sales_comp2_cap_rate: 'someValue'
  },
  tmp3: {
     sales_comp3: 'someValue',
     sales_comp3_dos: 'someValue',
     sales_comp3_units: 'someValue',
     sales_comp3_NOI_unit: 'someValue',
     sales_comp3_sales_pr_unit: 'someValue',
     sales_comp3_adj_SPrice: 'someValue',
     sales_comp3_cap_rate: 'someValue'
  }
}
*/

现在只需将“tmpStorage”的内容推送到新的“data.salesComps”数组即可

data.salesComps = Object.keys(tmpStorage).map(function(t) {
    return tmpStorage[t];
});

现在“数据”看起来像这样......

console.log('data:',data);
/* =>
data: { 
  name: 'someValue',
  date: 'someValue',
  age: 'someValue',
  price: 'someValue',
  salesComps: [
     { sales_comp1: 'someValue',
       sales_comp1_dos: 'someValue',
       sales_comp1_units: 'someValue',
       sales_comp1_NOI_unit: 'someValue',
       sales_comp1_sales_pr_unit: 'someValue',
       sales_comp1_adj_SPrice: 'someValue',
       sales_comp1_cap_rate: 'someValue'
     },
     { sales_comp2: 'someValue',
       sales_comp2_dos: 'someValue',
       sales_comp2_units: 'someValue',
       sales_comp2_NOI_unit: 'someValue',
       sales_comp2_sales_pr_unit: 'someValue',
       sales_comp2_adj_SPrice: 'someValue',
       sales_comp2_cap_rate: 'someValue' 
    },
    {  sales_comp3: 'someValue',
       sales_comp3_dos: 'someValue',
       sales_comp3_units: 'someValue',
       sales_comp3_NOI_unit: 'someValue',
       sales_comp3_sales_pr_unit: 'someValue',
       sales_comp3_adj_SPrice: 'someValue',
       sales_comp3_cap_rate: 'someValue' 
    }
  ]
}
*/

它可能看起来很复杂,但一旦您取出所有评论,您就会发现这是一个相对简单的两阶段过程 - 删除您需要的数据,然后以您想要的格式将其添加回来。

希望有帮助:)

关于javascript - 如何将文档字段重组为数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44812648/

相关文章:

python - 在嵌套数组 pymongo 中查找

mongodb - 错误 : type parameter `D` must be used as the type parameter for some local type

javascript - 将 R dygraphs 用于分数时间点?

javascript - 如何检查数字是否大于 ng-change 上的数字

node.js - azure:在node.js azure函数应用程序中服务器端SVG到PNG?没有任何作用

javascript - Mocha 测试服务器提供的经过身份验证的 API

node.js - 与 npm link 链接的包不会更新

javascript - 有没有办法检测访问者在打开新窗口后何时返回您的页面?

javascript - <a> 的字体颜色在 toggleClass() 上没有改变

node.js - 如何使用node js从react crud删除数据到mongoDB