Javascript 如何将文档字段重新构造为数组

Javascript 如何将文档字段重新构造为数组,javascript,node.js,mongodb,mongoose,nosql,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

我有一些数据如下所示:

{
  "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\u comp”数据出现。当它将键值对插入到保持对象中并从主数据中删除该条目时。完成后,将保留对象添加回数据中。像这样的

console.log('data:',data);
/* =>
data: {
  name: 'someValue',
  date: 'someValue',
  age: 'someValue',
  price: 'someValue'
}
*/
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'
  }
}
*/
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' 
    }
  ]
}
*/
数据

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'
}
*/
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'
  }
}
*/
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' 
    }
  ]
}
*/
tmpStorage对象如下所示

console.log('data:',data);
/* =>
data: {
  name: 'someValue',
  date: 'someValue',
  age: 'someValue',
  price: 'someValue'
}
*/
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'
  }
}
*/
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' 
    }
  ]
}
*/
现在只需将“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'
}
*/
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'
  }
}
*/
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' 
    }
  ]
}
*/
它可能看起来很复杂,但是一旦你删除了所有的评论,你就会看到它是一个相对简单的两阶段过程——删除你需要的数据,然后以你想要的格式重新添加


希望有帮助:)

首先,使用
Object.keys()
循环遍历数据,等待“sales\u comp”数据出现。当它将键值对插入到保持对象中并从主数据中删除该条目时。完成后,将保留对象添加回数据中。像这样的

console.log('data:',data);
/* =>
data: {
  name: 'someValue',
  date: 'someValue',
  age: 'someValue',
  price: 'someValue'
}
*/
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'
  }
}
*/
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' 
    }
  ]
}
*/
数据

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'
}
*/
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'
  }
}
*/
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' 
    }
  ]
}
*/
tmpStorage对象如下所示

console.log('data:',data);
/* =>
data: {
  name: 'someValue',
  date: 'someValue',
  age: 'someValue',
  price: 'someValue'
}
*/
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'
  }
}
*/
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' 
    }
  ]
}
*/
现在只需将“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'
}
*/
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'
  }
}
*/
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' 
    }
  ]
}
*/
它可能看起来很复杂,但是一旦你删除了所有的评论,你就会看到它是一个相对简单的两阶段过程——删除你需要的数据,然后以你想要的格式重新添加


希望对您有所帮助:)

一次性操作最好在mongo shell中完成,它有JavaScript环境来处理此操作,而无需考虑回调和承诺

因此,这里最好的做法是循环收集结果,并在将字段转换为数组后通过方法重新写入收集:

var name = "collection";  
var ops = [];

db.getCollection(name).find().forEach(doc => {

    var obj = Object.keys(doc).filter(k => /^sales_comp/.test(k))
     .map( k => ({ [k.match(/\d+/)[0]]: { [k.replace(/\d+/,"")]: doc[k] }}))
     .reduce((acc,curr) => {
       let a = Object.keys(curr)[0];
       if ( !acc.hasOwnProperty(a) )
         acc[a] = { };
       acc[a][Object.keys(curr[a])[0]] = curr[a][Object.keys(curr[a])[0]];
       return acc;
     },{});

    // Un-comment and swap if you don't want to retain the index number
    //var comps = Object.keys(obj).map( k => obj[k] )
    var comps = Object.keys(obj).map( k => Object.assign({ "index": parseInt(k) },obj[k]) );

    var unset = Object.keys(doc).filter(k => /^sales_comp/.test(k))
      .reduce((acc,curr) => Object.assign(acc,({ [curr]: 1 })),{});

    ops.push({
      "updateOne": {
        "filter": { "_id": doc._id },
        "update": {
          "$unset": unset,
          "$set": { "salesComps": comps }   
        }
      }        
    });

    if ( ops.length >= 500 ) {
      db.getCollection(name).bulkWrite(ops);
      ops = [];
    }
});

if ( ops.length > 0 ) {
  db.getCollection(name).bulkWrite(ops);
  ops = [];   
}
这将重写每个文档,如:

{
    "_id" : ObjectId("5954461a38470d375d40aca1"),
    "name" : "someValue",
    "date" : "someValue",
    "age" : "someValue",
    "price" : "someValue",
    "salesComps" : [ 
        {
            "index" : 1,
            "sales_comp" : "someValue",
            "sales_comp_dos" : "someValue",
            "sales_comp_units" : "someValue",
            "sales_comp_NOI_unit" : "someValue",
            "sales_comp_sales_pr_unit" : "someValue",
            "sales_comp_adj_SPrice" : "someValue",
            "sales_comp_cap_rate" : "someValue"
        }, 
        {
            "index" : 2,
            "sales_comp" : "someValue",
            "sales_comp_dos" : "someValue",
            "sales_comp_units" : "someValue",
            "sales_comp_NOI_unit" : "someValue",
            "sales_comp_sales_pr_unit" : "someValue",
            "sales_comp_adj_SPrice" : "someValue",
            "sales_comp_cap_rate" : "someValue"
        }, 
        {
            "index" : 3,
            "sales_comp" : "someValue",
            "sales_comp_dos" : "someValue",
            "sales_comp_units" : "someValue",
            "sales_comp_NOI_unit" : "someValue",
            "sales_comp_sales_pr_unit" : "someValue",
            "sales_comp_adj_SPrice" : "someValue",
            "sales_comp_cap_rate" : "someValue"
        }
    ]
}
这基本上是检查文档中“键”的名称,从
“sales\u comp”
开始,在根据字符串的数字部分累积键并从名称中剥离后,数据将转换为每个不同数值的数组

在实际处理对目标集合的“更新”时,我们使用以
“sales\u comp
开头的字段上的运算符从文档中删除这些内容。然后,我们使用运算符和转换的数组来创建新属性


这里使用了一些常见的习惯用法,在使用JavaScript处理数据结构时,您应该熟悉这些习惯用法。

一次性操作最好在mongo shell中完成,它有JavaScript环境来处理这些操作,而无需考虑回调和承诺

因此,这里最好的做法是循环收集结果,并在将字段转换为数组后通过方法重新写入收集:

var name = "collection";  
var ops = [];

db.getCollection(name).find().forEach(doc => {

    var obj = Object.keys(doc).filter(k => /^sales_comp/.test(k))
     .map( k => ({ [k.match(/\d+/)[0]]: { [k.replace(/\d+/,"")]: doc[k] }}))
     .reduce((acc,curr) => {
       let a = Object.keys(curr)[0];
       if ( !acc.hasOwnProperty(a) )
         acc[a] = { };
       acc[a][Object.keys(curr[a])[0]] = curr[a][Object.keys(curr[a])[0]];
       return acc;
     },{});

    // Un-comment and swap if you don't want to retain the index number
    //var comps = Object.keys(obj).map( k => obj[k] )
    var comps = Object.keys(obj).map( k => Object.assign({ "index": parseInt(k) },obj[k]) );

    var unset = Object.keys(doc).filter(k => /^sales_comp/.test(k))
      .reduce((acc,curr) => Object.assign(acc,({ [curr]: 1 })),{});

    ops.push({
      "updateOne": {
        "filter": { "_id": doc._id },
        "update": {
          "$unset": unset,
          "$set": { "salesComps": comps }   
        }
      }        
    });

    if ( ops.length >= 500 ) {
      db.getCollection(name).bulkWrite(ops);
      ops = [];
    }
});

if ( ops.length > 0 ) {
  db.getCollection(name).bulkWrite(ops);
  ops = [];   
}
这将重写每个文档,如:

{
    "_id" : ObjectId("5954461a38470d375d40aca1"),
    "name" : "someValue",
    "date" : "someValue",
    "age" : "someValue",
    "price" : "someValue",
    "salesComps" : [ 
        {
            "index" : 1,
            "sales_comp" : "someValue",
            "sales_comp_dos" : "someValue",
            "sales_comp_units" : "someValue",
            "sales_comp_NOI_unit" : "someValue",
            "sales_comp_sales_pr_unit" : "someValue",
            "sales_comp_adj_SPrice" : "someValue",
            "sales_comp_cap_rate" : "someValue"
        }, 
        {
            "index" : 2,
            "sales_comp" : "someValue",
            "sales_comp_dos" : "someValue",
            "sales_comp_units" : "someValue",
            "sales_comp_NOI_unit" : "someValue",
            "sales_comp_sales_pr_unit" : "someValue",
            "sales_comp_adj_SPrice" : "someValue",
            "sales_comp_cap_rate" : "someValue"
        }, 
        {
            "index" : 3,
            "sales_comp" : "someValue",
            "sales_comp_dos" : "someValue",
            "sales_comp_units" : "someValue",
            "sales_comp_NOI_unit" : "someValue",
            "sales_comp_sales_pr_unit" : "someValue",
            "sales_comp_adj_SPrice" : "someValue",
            "sales_comp_cap_rate" : "someValue"
        }
    ]
}
这基本上是检查文档中“键”的名称,从
“sales\u comp”
开始,在根据字符串的数字部分累积键并从名称中剥离后,数据将转换为每个不同数值的数组

在实际处理对目标集合的“更新”时,我们使用以“
”sales\u comp
开头的字段上的运算符从文档中删除这些内容。然后,我们对转换后的数组使用操作符来创建新属性

这里使用了一些常见的习惯用法,在使用JavaScript处理数据结构时应该熟悉这些习惯用法